Initial Commit

This commit is contained in:
2023-06-21 12:46:23 -04:00
commit c70248a520
1352 changed files with 336780 additions and 0 deletions

View File

@@ -0,0 +1,213 @@
using System;
using System.Text;
using System.Drawing;
using iTextSharp.text;
/*
* $Id: HtmlEncoder.cs,v 1.6 2008/05/13 11:25:15 psoares33 Exp $
*
*
* Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html {
/**
* This class converts a <CODE>String</CODE> to the HTML-format of a String.
* <P>
* To convert the <CODE>String</CODE>, each character is examined:
* <UL>
* <LI>ASCII-characters from 000 till 031 are represented as &amp;#xxx;<BR>
* (with xxx = the value of the character)
* <LI>ASCII-characters from 032 t/m 127 are represented by the character itself, except for:
* <UL>
* <LI>'\n' becomes &lt;BR&gt;\n
* <LI>&quot; becomes &amp;quot;
* <LI>&amp; becomes &amp;amp;
* <LI>&lt; becomes &amp;lt;
* <LI>&gt; becomes &amp;gt;
* </UL>
* <LI>ASCII-characters from 128 till 255 are represented as &amp;#xxx;<BR>
* (with xxx = the value of the character)
* </UL>
* <P>
* Example:
* <P><BLOCKQUOTE><PRE>
* String htmlPresentation = HtmlEncoder.Encode("Marie-Th&#233;r&#232;se S&#248;rensen");
* </PRE></BLOCKQUOTE><P>
* for more info: see O'Reilly; "HTML: The Definitive Guide" (page 164)
*
* @author mario.maccarini@rug.ac.be
*/
public sealed class HtmlEncoder {
// membervariables
/** List with the HTML translation of all the characters. */
private static String[] htmlCode = new String[256];
static HtmlEncoder() {
for (int i = 0; i < 10; i++) {
htmlCode[i] = "&#00" + i + ";";
}
for (int i = 10; i < 32; i++) {
htmlCode[i] = "&#0" + i + ";";
}
for (int i = 32; i < 128; i++) {
htmlCode[i] = ((char)i).ToString();
}
// Special characters
htmlCode['\t'] = "\t";
htmlCode['\n'] = "<" + HtmlTags.NEWLINE + " />\n";
htmlCode['\"'] = "&quot;"; // double quote
htmlCode['&'] = "&amp;"; // ampersand
htmlCode['<'] = "&lt;"; // lower than
htmlCode['>'] = "&gt;"; // greater than
for (int i = 128; i < 256; i++) {
htmlCode[i] = "&#" + i + ";";
}
}
// constructors
/**
* This class will never be constructed.
* <P>
* HtmlEncoder only contains static methods.
*/
private HtmlEncoder () { }
// methods
/**
* Converts a <CODE>String</CODE> to the HTML-format of this <CODE>String</CODE>.
*
* @param string The <CODE>String</CODE> to convert
* @return a <CODE>String</CODE>
*/
public static String Encode(String str) {
int n = str.Length;
char character;
StringBuilder buffer = new StringBuilder();
// loop over all the characters of the String.
for (int i = 0; i < n; i++) {
character = str[i];
// the Htmlcode of these characters are added to a StringBuilder one by one
if (character < 256) {
buffer.Append(htmlCode[character]);
}
else {
// Improvement posted by Joachim Eyrich
buffer.Append("&#").Append((int)character).Append(';');
}
}
return buffer.ToString();
}
/**
* Converts a <CODE>Color</CODE> into a HTML representation of this <CODE>Color</CODE>.
*
* @param color the <CODE>Color</CODE> that has to be converted.
* @return the HTML representation of this <COLOR>Color</COLOR>
*/
public static String Encode(Color color) {
StringBuilder buffer = new StringBuilder("#");
if (color.R < 16) {
buffer.Append('0');
}
buffer.Append(System.Convert.ToString(color.R, 16));
if (color.G < 16) {
buffer.Append('0');
}
buffer.Append(System.Convert.ToString(color.G, 16));
if (color.B < 16) {
buffer.Append('0');
}
buffer.Append(System.Convert.ToString(color.B, 16));
return buffer.ToString();
}
/**
* Translates the alignment value.
*
* @param alignment the alignment value
* @return the translated value
*/
public static String GetAlignment(int alignment) {
switch (alignment) {
case Element.ALIGN_LEFT:
return HtmlTags.ALIGN_LEFT;
case Element.ALIGN_CENTER:
return HtmlTags.ALIGN_CENTER;
case Element.ALIGN_RIGHT:
return HtmlTags.ALIGN_RIGHT;
case Element.ALIGN_JUSTIFIED:
case Element.ALIGN_JUSTIFIED_ALL:
return HtmlTags.ALIGN_JUSTIFIED;
case Element.ALIGN_TOP:
return HtmlTags.ALIGN_TOP;
case Element.ALIGN_MIDDLE:
return HtmlTags.ALIGN_MIDDLE;
case Element.ALIGN_BOTTOM:
return HtmlTags.ALIGN_BOTTOM;
case Element.ALIGN_BASELINE:
return HtmlTags.ALIGN_BASELINE;
default:
return "";
}
}
}
}

View File

@@ -0,0 +1,239 @@
using System;
using System.IO;
using System.Xml;
using System.Collections;
using iTextSharp.text;
using iTextSharp.text.xml;
/*
* Copyright 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html {
/// <summary>
/// This class can be used to parse an XML file.
/// </summary>
public class HtmlParser : XmlParser{
/// <summary>
/// Constructs an XmlParser.
/// </summary>
public HtmlParser() {
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
public override void Go(IDocListener document, XmlDocument xDoc) {
parser = new ITextmyHtmlHandler(document);
parser.Parse(xDoc);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
public override void Go(IDocListener document, String file) {
parser = new ITextmyHtmlHandler(document);
parser.Parse(file);
}
/// <summary>
/// Parses a given XmlTextReader.
/// </summary>
/// <param name="document"></param>
/// <param name="reader"></param>
public override void Go(IDocListener document, XmlTextReader reader) {
parser = new ITextmyHtmlHandler(document);
parser.Parse(reader);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
/// <param name="tagmap"></param>
public override void Go(IDocListener document, XmlDocument xDoc, XmlDocument xTagmap) {
parser = new ITextmyHtmlHandler(document, new TagMap(xTagmap));
parser.Parse(xDoc);
}
/// <summary>
/// Parses a given XmlTextReader.
/// </summary>
/// <param name="document"></param>
/// <param name="reader"></param>
/// <param name="tagmap"></param>
public override void Go(IDocListener document, XmlTextReader reader, String tagmap) {
parser = new ITextmyHtmlHandler(document, new TagMap(tagmap));
parser.Parse(reader);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
/// <param name="tagmap"></param>
public override void Go(IDocListener document, String file, String tagmap) {
parser = new ITextmyHtmlHandler(document, new TagMap(tagmap));
parser.Parse(file);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
/// <param name="tagmap"></param>
public override void Go(IDocListener document, String file, Hashtable tagmap) {
parser = new ITextmyHtmlHandler(document, tagmap);
parser.Parse(file);
}
/// <summary>
/// Parses a given XmlTextReader.
/// </summary>
/// <param name="document"></param>
/// <param name="reader"></param>
/// <param name="tagmap"></param>
public override void Go(IDocListener document, XmlTextReader reader, Hashtable tagmap) {
parser = new ITextmyHtmlHandler(document, tagmap);
parser.Parse(reader);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
public new static void Parse(IDocListener document, XmlDocument xDoc) {
HtmlParser p = new HtmlParser();
p.Go(document, xDoc);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
public new static void Parse(IDocListener document, String file) {
HtmlParser p = new HtmlParser();
p.Go(document, file);
}
/// <summary>
/// Parses a given XmlTextReader.
/// </summary>
/// <param name="document"></param>
/// <param name="reader"></param>
public new static void Parse(IDocListener document, XmlTextReader reader) {
HtmlParser p = new HtmlParser();
p.Go(document, reader);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
/// <param name="tagmap"></param>
public new static void Parse(IDocListener document, XmlDocument xDoc, XmlDocument xTagmap) {
HtmlParser p = new HtmlParser();
p.Go(document, xDoc, xTagmap);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
/// <param name="tagmap"></param>
public new static void Parse(IDocListener document, String file, String tagmap) {
HtmlParser p = new HtmlParser();
p.Go(document, file, tagmap);
}
/// <summary>
/// Parses a given file.
/// </summary>
/// <param name="document"></param>
/// <param name="file"></param>
/// <param name="tagmap"></param>
public new static void Parse(IDocListener document, String file, Hashtable tagmap) {
HtmlParser p = new HtmlParser();
p.Go(document, file, tagmap);
}
/// <summary>
/// Parses a given XmlTextReader.
/// </summary>
/// <param name="document"></param>
/// <param name="reader"></param>
/// <param name="tagmap"></param>
public new static void Parse(IDocListener document, XmlTextReader reader, String tagmap) {
HtmlParser p = new HtmlParser();
p.Go(document, reader, tagmap);
}
/// <summary>
/// Parses a given XmlTextReader.
/// </summary>
/// <param name="document"></param>
/// <param name="reader"></param>
/// <param name="tagmap"></param>
public new static void Parse(IDocListener document, XmlTextReader reader, Hashtable tagmap) {
HtmlParser p = new HtmlParser();
p.Go(document, reader, tagmap);
}
}
}

View File

@@ -0,0 +1,102 @@
using System;
using System.Globalization;
using System.Collections;
using iTextSharp.text.xml;
using System.util;
/*
* $Id: HtmlPeer.cs,v 1.4 2008/05/13 11:25:15 psoares33 Exp $
*
*
* Copyright 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html {
/**
* This interface is implemented by the peer of all the iText objects.
*/
public class HtmlPeer : XmlPeer {
/**
* Creates a XmlPeer.
* @param name the iText name of the tag
* @param alias the Html name of the tag
*/
public HtmlPeer(String name, String alias) : base(name, alias.ToLower(CultureInfo.InvariantCulture)) {
}
/**
* Sets an alias for an attribute.
*
* @param name the iText tagname
* @param alias the custom tagname
*/
public override void AddAlias(String name, String alias) {
attributeAliases.Add(alias.ToLower(CultureInfo.InvariantCulture), name);
}
/**
* @see com.lowagie.text.xml.XmlPeer#getAttributes(org.xml.sax.Attributes)
*/
public override Properties GetAttributes(Hashtable attrs) {
Properties attributes = new Properties();
attributes.AddAll(attributeValues);
if (defaultContent != null) {
attributes[ElementTags.ITEXT] = defaultContent;
}
if (attrs != null) {
foreach (string key in attrs.Keys) {
attributes.Add(GetName(key).ToLower(CultureInfo.InvariantCulture), (string)attrs[key]);
}
}
return attributes;
}
}
}

View File

@@ -0,0 +1,289 @@
using System;
using System.util;
using System.Collections;
using iTextSharp.text;
/*
* $Id: HtmlTagMap.cs,v 1.4 2008/05/13 11:25:15 psoares33 Exp $
*
*
* Copyright 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html {
/**
* The <CODE>Tags</CODE>-class maps several XHTML-tags to iText-objects.
*/
public class HtmlTagMap : Hashtable {
/**
* Constructs an HtmlTagMap.
*/
public HtmlTagMap() {
HtmlPeer peer;
peer = new HtmlPeer(ElementTags.ITEXT, HtmlTags.HTML);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.SPAN);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.CHUNK, HtmlTags.CHUNK);
peer.AddAlias(ElementTags.FONT, HtmlTags.FONT);
peer.AddAlias(ElementTags.SIZE, HtmlTags.SIZE);
peer.AddAlias(ElementTags.COLOR, HtmlTags.COLOR);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.ANCHOR, HtmlTags.ANCHOR);
peer.AddAlias(ElementTags.NAME, HtmlTags.NAME);
peer.AddAlias(ElementTags.REFERENCE, HtmlTags.REFERENCE);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.PARAGRAPH);
peer.AddAlias(ElementTags.ALIGN, HtmlTags.ALIGN);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.DIV);
peer.AddAlias(ElementTags.ALIGN, HtmlTags.ALIGN);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[0]);
peer.AddValue(ElementTags.SIZE, "20");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[1]);
peer.AddValue(ElementTags.SIZE, "18");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[2]);
peer.AddValue(ElementTags.SIZE, "16");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[3]);
peer.AddValue(ElementTags.SIZE, "14");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[4]);
peer.AddValue(ElementTags.SIZE, "12");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[5]);
peer.AddValue(ElementTags.SIZE, "10");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.LIST, HtmlTags.ORDEREDLIST);
peer.AddValue(ElementTags.NUMBERED, "true");
peer.AddValue(ElementTags.SYMBOLINDENT, "20");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.LIST, HtmlTags.UNORDEREDLIST);
peer.AddValue(ElementTags.NUMBERED, "false");
peer.AddValue(ElementTags.SYMBOLINDENT, "20");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.LISTITEM, HtmlTags.LISTITEM);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.I);
peer.AddValue(ElementTags.STYLE, Markup.CSS_VALUE_ITALIC);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.EM);
peer.AddValue(ElementTags.STYLE, Markup.CSS_VALUE_ITALIC);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.B);
peer.AddValue(ElementTags.STYLE, Markup.CSS_VALUE_BOLD);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.STRONG);
peer.AddValue(ElementTags.STYLE, Markup.CSS_VALUE_BOLD);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.S);
peer.AddValue(ElementTags.STYLE, Markup.CSS_VALUE_LINETHROUGH);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.CODE);
peer.AddValue(ElementTags.FONT, FontFactory.COURIER);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.VAR);
peer.AddValue(ElementTags.FONT, FontFactory.COURIER);
peer.AddValue(ElementTags.STYLE, Markup.CSS_VALUE_ITALIC);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.U);
peer.AddValue(ElementTags.STYLE, Markup.CSS_VALUE_UNDERLINE);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.CHUNK, HtmlTags.SUP);
peer.AddValue(ElementTags.SUBSUPSCRIPT, "6.0");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.CHUNK, HtmlTags.SUB);
peer.AddValue(ElementTags.SUBSUPSCRIPT, "-6.0");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.HORIZONTALRULE, HtmlTags.HORIZONTALRULE);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.TABLE, HtmlTags.TABLE);
peer.AddAlias(ElementTags.WIDTH, HtmlTags.WIDTH);
peer.AddAlias(ElementTags.BACKGROUNDCOLOR, HtmlTags.BACKGROUNDCOLOR);
peer.AddAlias(ElementTags.BORDERCOLOR, HtmlTags.BORDERCOLOR);
peer.AddAlias(ElementTags.COLUMNS, HtmlTags.COLUMNS);
peer.AddAlias(ElementTags.CELLPADDING, HtmlTags.CELLPADDING);
peer.AddAlias(ElementTags.CELLSPACING, HtmlTags.CELLSPACING);
peer.AddAlias(ElementTags.BORDERWIDTH, HtmlTags.BORDERWIDTH);
peer.AddAlias(ElementTags.ALIGN, HtmlTags.ALIGN);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.ROW, HtmlTags.ROW);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.CELL, HtmlTags.CELL);
peer.AddAlias(ElementTags.WIDTH, HtmlTags.WIDTH);
peer.AddAlias(ElementTags.BACKGROUNDCOLOR, HtmlTags.BACKGROUNDCOLOR);
peer.AddAlias(ElementTags.BORDERCOLOR, HtmlTags.BORDERCOLOR);
peer.AddAlias(ElementTags.COLSPAN, HtmlTags.COLSPAN);
peer.AddAlias(ElementTags.ROWSPAN, HtmlTags.ROWSPAN);
peer.AddAlias(ElementTags.NOWRAP, HtmlTags.NOWRAP);
peer.AddAlias(ElementTags.HORIZONTALALIGN, HtmlTags.HORIZONTALALIGN);
peer.AddAlias(ElementTags.VERTICALALIGN, HtmlTags.VERTICALALIGN);
peer.AddValue(ElementTags.HEADER, "false");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.CELL, HtmlTags.HEADERCELL);
peer.AddAlias(ElementTags.WIDTH, HtmlTags.WIDTH);
peer.AddAlias(ElementTags.BACKGROUNDCOLOR, HtmlTags.BACKGROUNDCOLOR);
peer.AddAlias(ElementTags.BORDERCOLOR, HtmlTags.BORDERCOLOR);
peer.AddAlias(ElementTags.COLSPAN, HtmlTags.COLSPAN);
peer.AddAlias(ElementTags.ROWSPAN, HtmlTags.ROWSPAN);
peer.AddAlias(ElementTags.NOWRAP, HtmlTags.NOWRAP);
peer.AddAlias(ElementTags.HORIZONTALALIGN, HtmlTags.HORIZONTALALIGN);
peer.AddAlias(ElementTags.VERTICALALIGN, HtmlTags.VERTICALALIGN);
peer.AddValue(ElementTags.HEADER, "true");
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.IMAGE, HtmlTags.IMAGE);
peer.AddAlias(ElementTags.URL, HtmlTags.URL);
peer.AddAlias(ElementTags.ALT, HtmlTags.ALT);
peer.AddAlias(ElementTags.PLAINWIDTH, HtmlTags.PLAINWIDTH);
peer.AddAlias(ElementTags.PLAINHEIGHT, HtmlTags.PLAINHEIGHT);
this[peer.Alias] = peer;
peer = new HtmlPeer(ElementTags.NEWLINE, HtmlTags.NEWLINE);
this[peer.Alias] = peer;
}
/**
* Checks if this is the root tag.
* @param tag a tagvalue
* @return true if tag is HTML or html
*/
public static bool IsHtml(String tag) {
return Util.EqualsIgnoreCase(HtmlTags.HTML, tag);
}
/**
* Checks if this is the head tag.
* @param tag a tagvalue
* @return true if tag is HEAD or head
*/
public static bool IsHead(String tag) {
return Util.EqualsIgnoreCase(HtmlTags.HEAD, tag);
}
/**
* Checks if this is the meta tag.
* @param tag a tagvalue
* @return true if tag is META or meta
*/
public static bool IsMeta(String tag) {
return Util.EqualsIgnoreCase(HtmlTags.META, tag);
}
/**
* Checks if this is the linl tag.
* @param tag a tagvalue
* @return true if tag is LINK or link
*/
public static bool IsLink(String tag) {
return Util.EqualsIgnoreCase(HtmlTags.LINK, tag);
}
/**
* Checks if this is the title tag.
* @param tag a tagvalue
* @return true if tag is TITLE or title
*/
public static bool IsTitle(String tag) {
return Util.EqualsIgnoreCase(HtmlTags.TITLE, tag);
}
/**
* Checks if this is the root tag.
* @param tag a tagvalue
* @return true if tag is BODY or body
*/
public static bool IsBody(String tag) {
return Util.EqualsIgnoreCase(HtmlTags.BODY, tag);
}
/**
* Checks if this is a special tag.
* @param tag a tagvalue
* @return true if tag is a HTML, HEAD, META, LINK or BODY tag (case insensitive)
*/
public static bool IsSpecialTag(String tag) {
return IsHtml(tag) || IsHead(tag) || IsMeta(tag) || IsLink(tag) || IsBody(tag);
}
}
}

View File

@@ -0,0 +1,325 @@
using System;
/*
* $Id: HtmlTags.cs,v 1.4 2008/05/13 11:25:15 psoares33 Exp $
*
*
* Copyright 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html {
/**
* A class that contains all the possible tagnames and their attributes.
*/
public class HtmlTags {
/** the root tag. */
public const string HTML = "html";
/** the head tag */
public const string HEAD = "head";
/** This is a possible HTML attribute for the HEAD tag. */
public const string CONTENT = "content";
/** the meta tag */
public const string META = "meta";
/** attribute of the root tag */
public const string SUBJECT = "subject";
/** attribute of the root tag */
public const string KEYWORDS = "keywords";
/** attribute of the root tag */
public const string AUTHOR = "author";
/** the title tag. */
public const string TITLE = "title";
/** the script tag. */
public const string SCRIPT = "script";
/** This is a possible HTML attribute for the SCRIPT tag. */
public const string LANGUAGE = "language";
/** This is a possible value for the LANGUAGE attribute. */
public const string JAVASCRIPT = "JavaScript";
/** the body tag. */
public const string BODY = "body";
/** This is a possible HTML attribute for the BODY tag */
public const string JAVASCRIPT_ONLOAD = "onLoad";
/** This is a possible HTML attribute for the BODY tag */
public const string JAVASCRIPT_ONUNLOAD = "onUnLoad";
/** This is a possible HTML attribute for the BODY tag. */
public const string TOPMARGIN = "topmargin";
/** This is a possible HTML attribute for the BODY tag. */
public const string BOTTOMMARGIN = "bottommargin";
/** This is a possible HTML attribute for the BODY tag. */
public const string LEFTMARGIN = "leftmargin";
/** This is a possible HTML attribute for the BODY tag. */
public const string RIGHTMARGIN = "rightmargin";
// Phrases, Anchors, Lists and Paragraphs
/** the chunk tag */
public const string CHUNK = "font";
/** the phrase tag */
public const string CODE = "code";
/** the phrase tag */
public const string VAR = "var";
/** the anchor tag */
public const string ANCHOR = "a";
/** the list tag */
public const string ORDEREDLIST = "ol";
/** the list tag */
public const string UNORDEREDLIST = "ul";
/** the listitem tag */
public const string LISTITEM = "li";
/** the paragraph tag */
public const string PARAGRAPH = "p";
/** attribute of anchor tag */
public const string NAME = "name";
/** attribute of anchor tag */
public const string REFERENCE = "href";
/** attribute of anchor tag */
public static string[] H = {"h1", "h2", "h3", "h4", "h5", "h6"};
// Chunks
/** attribute of the chunk tag */
public const string FONT = "face";
/** attribute of the chunk tag */
public const string SIZE = "point-size";
/** attribute of the chunk/table/cell tag */
public const string COLOR = "color";
/** some phrase tag */
public const string EM = "em";
/** some phrase tag */
public const string I = "i";
/** some phrase tag */
public const string STRONG = "strong";
/** some phrase tag */
public const string B = "b";
/** some phrase tag */
public const string S = "s";
/** some phrase tag */
public const string U = "u";
/** some phrase tag */
public const string SUB = "sub";
/** some phrase tag */
public const string SUP = "sup";
/** the possible value of a tag */
public const string HORIZONTALRULE = "hr";
// tables/cells
/** the table tag */
public const string TABLE = "table";
/** the cell tag */
public const string ROW = "tr";
/** the cell tag */
public const string CELL = "td";
/** attribute of the cell tag */
public const string HEADERCELL = "th";
/** attribute of the table tag */
public const string COLUMNS = "cols";
/** attribute of the table tag */
public const string CELLPADDING = "cellpadding";
/** attribute of the table tag */
public const string CELLSPACING = "cellspacing";
/** attribute of the cell tag */
public const string COLSPAN = "colspan";
/** attribute of the cell tag */
public const string ROWSPAN = "rowspan";
/** attribute of the cell tag */
public const string NOWRAP = "nowrap";
/** attribute of the table/cell tag */
public const string BORDERWIDTH = "border";
/** attribute of the table/cell tag */
public const string WIDTH = "width";
/** attribute of the table/cell tag */
public const string BACKGROUNDCOLOR = "bgcolor";
/** attribute of the table/cell tag */
public const string BORDERCOLOR = "bordercolor";
/** attribute of paragraph/image/table tag */
public const string ALIGN = "align";
/** attribute of chapter/section/paragraph/table/cell tag */
public const string LEFT = "left";
/** attribute of chapter/section/paragraph/table/cell tag */
public const string RIGHT = "right";
/** attribute of the cell tag */
public const string HORIZONTALALIGN = "align";
/** attribute of the cell tag */
public const string VERTICALALIGN = "valign";
/** attribute of the table/cell tag */
public const string TOP = "top";
/** attribute of the table/cell tag */
public const string BOTTOM = "bottom";
// Misc
/** the image tag */
public const string IMAGE = "img";
/** attribute of the image tag */
public const string URL = "src";
/** attribute of the image tag */
public const string ALT = "alt";
/** attribute of the image tag */
public const string PLAINWIDTH = "width";
/** attribute of the image tag */
public const string PLAINHEIGHT = "height";
/** the newpage tag */
public const string NEWLINE = "br";
// alignment attribute values
/** the possible value of an alignment attribute */
public const string ALIGN_LEFT = "Left";
/** the possible value of an alignment attribute */
public const string ALIGN_CENTER = "Center";
/** the possible value of an alignment attribute */
public const string ALIGN_RIGHT = "Right";
/** the possible value of an alignment attribute */
public const string ALIGN_JUSTIFIED = "Justify";
/** the possible value of an alignment attribute */
public const string ALIGN_TOP = "Top";
/** the possible value of an alignment attribute */
public const string ALIGN_MIDDLE = "Middle";
/** the possible value of an alignment attribute */
public const string ALIGN_BOTTOM = "Bottom";
/** the possible value of an alignment attribute */
public const string ALIGN_BASELINE = "Baseline";
/** the possible value of an alignment attribute */
public const string DEFAULT = "Default";
/** The DIV tag. */
public const string DIV = "div";
/** The SPAN tag. */
public const string SPAN = "span";
/** The LINK tag. */
public const string LINK = "link";
/** This is a possible HTML attribute for the LINK tag. */
public const string TEXT_CSS = "text/css";
/** This is a possible HTML attribute for the LINK tag. */
public const string REL = "rel";
/** This is used for inline css style information */
public const string STYLE = "style";
/** This is a possible HTML attribute for the LINK tag. */
public const string TYPE = "type";
/** This is a possible HTML attribute. */
public const string STYLESHEET = "stylesheet";
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,239 @@
using System;
using System.Collections;
using System.Globalization;
using System.util;
using iTextSharp.text;
using iTextSharp.text.xml;
using iTextSharp.text.pdf;
using iTextSharp.text.factories;
/*
* $Id: ITextmyHtmlHandler.cs,v 1.9 2008/05/13 11:25:15 psoares33 Exp $
*
*
* Copyright 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html {
/**
* The <CODE>Tags</CODE>-class maps several XHTML-tags to iText-objects.
*/
public class ITextmyHtmlHandler : ITextHandler {
/** These are the properties of the body section. */
private Properties bodyAttributes = new Properties();
/** This is the status of the table border. */
private bool tableBorder = false;
/**
* Constructs a new SAXiTextHandler that will translate all the events
* triggered by the parser to actions on the <CODE>Document</CODE>-object.
*
* @param document this is the document on which events must be triggered
*/
public ITextmyHtmlHandler(IDocListener document) : base(document, new HtmlTagMap()) {
}
public ITextmyHtmlHandler(IDocListener document, BaseFont bf) : base(document, new HtmlTagMap(), bf) {
}
/**
* Constructs a new SAXiTextHandler that will translate all the events
* triggered by the parser to actions on the <CODE>Document</CODE>-object.
*
* @param document this is the document on which events must be triggered
* @param htmlTags a tagmap translating HTML tags to iText tags
*/
public ITextmyHtmlHandler(IDocListener document, Hashtable htmlTags) : base(document, htmlTags) {
}
/**
* This method gets called when a start tag is encountered.
*
* @param uri the Uniform Resource Identifier
* @param lname the local name (without prefix), or the empty string if Namespace processing is not being performed.
* @param name the name of the tag that is encountered
* @param attrs the list of attributes
*/
public override void StartElement(String uri, String lname, String name, Hashtable attrs) {
//System.err.Println("Start: " + name);
// super.handleStartingTags is replaced with handleStartingTags
// suggestion by Vu Ngoc Tan/Hop
name = name.ToLower(CultureInfo.InvariantCulture);
if (HtmlTagMap.IsHtml(name)) {
// we do nothing
return;
}
if (HtmlTagMap.IsHead(name)) {
// we do nothing
return;
}
if (HtmlTagMap.IsTitle(name)) {
// we do nothing
return;
}
if (HtmlTagMap.IsMeta(name)) {
// we look if we can change the body attributes
String meta = null;
String content = null;
if (attrs != null) {
foreach (String attribute in attrs.Keys) {
if (Util.EqualsIgnoreCase(attribute, HtmlTags.CONTENT))
content = (String)attrs[attribute];
else if (Util.EqualsIgnoreCase(attribute, HtmlTags.NAME))
meta = (String)attrs[attribute];
}
}
if (meta != null && content != null) {
bodyAttributes.Add(meta, content);
}
return;
}
if (HtmlTagMap.IsLink(name)) {
// we do nothing for the moment, in a later version we could extract the style sheet
return;
}
if (HtmlTagMap.IsBody(name)) {
// maybe we could extract some info about the document: color, margins,...
// but that's for a later version...
XmlPeer peer = new XmlPeer(ElementTags.ITEXT, name);
peer.AddAlias(ElementTags.TOP, HtmlTags.TOPMARGIN);
peer.AddAlias(ElementTags.BOTTOM, HtmlTags.BOTTOMMARGIN);
peer.AddAlias(ElementTags.RIGHT, HtmlTags.RIGHTMARGIN);
peer.AddAlias(ElementTags.LEFT, HtmlTags.LEFTMARGIN);
bodyAttributes.AddAll(peer.GetAttributes(attrs));
HandleStartingTags(peer.Tag, bodyAttributes);
return;
}
if (myTags.ContainsKey(name)) {
XmlPeer peer = (XmlPeer) myTags[name];
if (ElementTags.TABLE.Equals(peer.Tag) || ElementTags.CELL.Equals(peer.Tag)) {
Properties p = peer.GetAttributes(attrs);
String value;
if (ElementTags.TABLE.Equals(peer.Tag) && (value = p[ElementTags.BORDERWIDTH]) != null) {
if (float.Parse(value, System.Globalization.NumberFormatInfo.InvariantInfo) > 0) {
tableBorder = true;
}
}
if (tableBorder) {
p.Add(ElementTags.LEFT, "true");
p.Add(ElementTags.RIGHT, "true");
p.Add(ElementTags.TOP, "true");
p.Add(ElementTags.BOTTOM, "true");
}
HandleStartingTags(peer.Tag, p);
return;
}
HandleStartingTags(peer.Tag, peer.GetAttributes(attrs));
return;
}
Properties attributes = new Properties();
if (attrs != null) {
foreach (String attribute in attrs.Keys) {
attributes.Add(attribute.ToLower(CultureInfo.InvariantCulture), ((String)attrs[attribute]).ToLower(CultureInfo.InvariantCulture));
}
}
HandleStartingTags(name, attributes);
}
/**
* This method gets called when an end tag is encountered.
*
* @param uri the Uniform Resource Identifier
* @param lname the local name (without prefix), or the empty string if Namespace processing is not being performed.
* @param name the name of the tag that ends
*/
public override void EndElement(String uri, String lname, String name) {
//System.err.Println("End: " + name);
name = name.ToLower(CultureInfo.InvariantCulture);
if (ElementTags.PARAGRAPH.Equals(name)) {
document.Add((IElement) stack.Pop());
return;
}
if (HtmlTagMap.IsHead(name)) {
// we do nothing
return;
}
if (HtmlTagMap.IsTitle(name)) {
if (currentChunk != null) {
bodyAttributes.Add(ElementTags.TITLE, currentChunk.Content);
}
return;
}
if (HtmlTagMap.IsMeta(name)) {
// we do nothing
return;
}
if (HtmlTagMap.IsLink(name)) {
// we do nothing
return;
}
if (HtmlTagMap.IsBody(name)) {
// we do nothing
return;
}
if (myTags.ContainsKey(name)) {
XmlPeer peer = (XmlPeer) myTags[name];
if (ElementTags.TABLE.Equals(peer.Tag)) {
tableBorder = false;
}
base.HandleEndingTags(peer.Tag);
return;
}
// super.handleEndingTags is replaced with handleEndingTags
// suggestion by Ken Auer
HandleEndingTags(name);
}
}
}

View File

@@ -0,0 +1,427 @@
using System;
using System.util;
using System.IO;
using System.Text;
using System.Collections;
using System.Globalization;
using iTextSharp.text;
/*
* $Id: Markup.cs,v 1.2 2008/05/13 11:25:16 psoares33 Exp $
*
*
* Copyright 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html {
/// <summary>
/// A class that contains all the possible tagnames and their attributes.
/// </summary>
public class Markup {
// iText specific
/** the key for any tag */
public const string ITEXT_TAG = "tag";
// HTML tags
/** the markup for the body part of a file */
public const string HTML_TAG_BODY = "body";
/** The DIV tag. */
public const string HTML_TAG_DIV = "div";
/** This is a possible HTML-tag. */
public const string HTML_TAG_LINK = "link";
/** The SPAN tag. */
public const string HTML_TAG_SPAN = "span";
// HTML attributes
/** the height attribute. */
public const string HTML_ATTR_HEIGHT = "height";
/** the hyperlink reference attribute. */
public const string HTML_ATTR_HREF = "href";
/** This is a possible HTML attribute for the LINK tag. */
public const string HTML_ATTR_REL = "rel";
/** This is used for inline css style information */
public const string HTML_ATTR_STYLE = "style";
/** This is a possible HTML attribute for the LINK tag. */
public const string HTML_ATTR_TYPE = "type";
/** This is a possible HTML attribute. */
public const string HTML_ATTR_STYLESHEET = "stylesheet";
/** the width attribute. */
public const string HTML_ATTR_WIDTH = "width";
/** attribute for specifying externally defined CSS class */
public const string HTML_ATTR_CSS_CLASS = "class";
/** The ID attribute. */
public const string HTML_ATTR_CSS_ID = "id";
// HTML values
/** This is a possible value for the language attribute (SCRIPT tag). */
public const string HTML_VALUE_JAVASCRIPT = "text/javascript";
/** This is a possible HTML attribute for the LINK tag. */
public const string HTML_VALUE_CSS = "text/css";
// CSS keys
/** the CSS tag for background color */
public const string CSS_KEY_BGCOLOR = "background-color";
/** the CSS tag for text color */
public const string CSS_KEY_COLOR = "color";
/** CSS key that indicate the way something has to be displayed */
public const string CSS_KEY_DISPLAY = "display";
/** the CSS tag for the font family */
public const string CSS_KEY_FONTFAMILY = "font-family";
/** the CSS tag for the font size */
public const string CSS_KEY_FONTSIZE = "font-size";
/** the CSS tag for the font style */
public const string CSS_KEY_FONTSTYLE = "font-style";
/** the CSS tag for the font weight */
public const string CSS_KEY_FONTWEIGHT = "font-weight";
/** the CSS tag for text decorations */
public const string CSS_KEY_LINEHEIGHT = "line-height";
/** the CSS tag for the margin of an object */
public const string CSS_KEY_MARGIN = "margin";
/** the CSS tag for the margin of an object */
public const string CSS_KEY_MARGINLEFT = "margin-left";
/** the CSS tag for the margin of an object */
public const string CSS_KEY_MARGINRIGHT = "margin-right";
/** the CSS tag for the margin of an object */
public const string CSS_KEY_MARGINTOP = "margin-top";
/** the CSS tag for the margin of an object */
public const string CSS_KEY_MARGINBOTTOM = "margin-bottom";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_PADDING = "padding";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_PADDINGLEFT = "padding-left";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_PADDINGRIGHT = "padding-right";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_PADDINGTOP = "padding-top";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_PADDINGBOTTOM = "padding-bottom";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_BORDERCOLOR = "border-color";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_BORDERWIDTH = "border-width";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_BORDERWIDTHLEFT = "border-left-width";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_BORDERWIDTHRIGHT = "border-right-width";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_BORDERWIDTHTOP = "border-top-width";
/** the CSS tag for the margin of an object */
public const String CSS_KEY_BORDERWIDTHBOTTOM = "border-bottom-width";
/** the CSS tag for adding a page break when the document is printed */
public const string CSS_KEY_PAGE_BREAK_AFTER = "page-break-after";
/** the CSS tag for adding a page break when the document is printed */
public const string CSS_KEY_PAGE_BREAK_BEFORE = "page-break-before";
/** the CSS tag for the horizontal alignment of an object */
public const string CSS_KEY_TEXTALIGN = "text-align";
/** the CSS tag for text decorations */
public const string CSS_KEY_TEXTDECORATION = "text-decoration";
/** the CSS tag for text decorations */
public const string CSS_KEY_VERTICALALIGN = "vertical-align";
/** the CSS tag for the visibility of objects */
public const string CSS_KEY_VISIBILITY = "visibility";
// CSS values
/** value for the CSS tag for adding a page break when the document is printed */
public const string CSS_VALUE_ALWAYS = "always";
/** A possible value for the DISPLAY key */
public const string CSS_VALUE_BLOCK = "block";
/** a CSS value for text font weight */
public const string CSS_VALUE_BOLD = "bold";
/** the value if you want to hide objects. */
public const string CSS_VALUE_HIDDEN = "hidden";
/** A possible value for the DISPLAY key */
public const string CSS_VALUE_INLINE = "inline";
/** a CSS value for text font style */
public const string CSS_VALUE_ITALIC = "italic";
/** a CSS value for text decoration */
public const string CSS_VALUE_LINETHROUGH = "line-through";
/** A possible value for the DISPLAY key */
public const string CSS_VALUE_LISTITEM = "list-item";
/** a CSS value */
public const string CSS_VALUE_NONE = "none";
/** a CSS value */
public const string CSS_VALUE_NORMAL = "normal";
/** a CSS value for text font style */
public const string CSS_VALUE_OBLIQUE = "oblique";
/** A possible value for the DISPLAY key */
public const string CSS_VALUE_TABLE = "table";
/** A possible value for the DISPLAY key */
public const string CSS_VALUE_TABLEROW = "table-row";
/** A possible value for the DISPLAY key */
public const string CSS_VALUE_TABLECELL = "table-cell";
/** the CSS value for a horizontal alignment of an object */
public const string CSS_VALUE_TEXTALIGNLEFT = "left";
/** the CSS value for a horizontal alignment of an object */
public const string CSS_VALUE_TEXTALIGNRIGHT = "right";
/** the CSS value for a horizontal alignment of an object */
public const string CSS_VALUE_TEXTALIGNCENTER = "center";
/** the CSS value for a horizontal alignment of an object */
public const string CSS_VALUE_TEXTALIGNJUSTIFY = "justify";
/** a CSS value for text decoration */
public const string CSS_VALUE_UNDERLINE = "underline";
/// <summary>
/// Parses a length.
/// </summary>
/// <param name="str">a length in the form of an optional + or -, followed by a number and a unit.</param>
/// <returns>a float</returns>
public static float ParseLength(string str) {
int pos = 0;
int length = str.Length;
bool ok = true;
while (ok && pos < length) {
switch (str[pos]) {
case '+':
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
pos++;
break;
default:
ok = false;
break;
}
}
if (pos == 0) return 0f;
if (pos == length) return float.Parse(str, System.Globalization.NumberFormatInfo.InvariantInfo);
float f = float.Parse(str.Substring(0, pos), System.Globalization.NumberFormatInfo.InvariantInfo);
str = str.Substring(pos);
// inches
if (str.StartsWith("in")) {
return f * 72f;
}
// centimeters
if (str.StartsWith("cm")) {
return (f / 2.54f) * 72f;
}
// millimeters
if (str.StartsWith("mm")) {
return (f / 25.4f) * 72f;
}
// picas
if (str.StartsWith("pc")) {
return f * 12f;
}
// default: we assume the length was measured in points
return f;
}
/// <summary>
/// Converts a <CODE>Color</CODE> into a HTML representation of this <CODE>Color</CODE>.
/// </summary>
/// <param name="color">the <CODE>Color</CODE> that has to be converted.</param>
/// <returns>the HTML representation of this <CODE>Color</CODE></returns>
public static Color DecodeColor(String s) {
if (s == null)
return null;
s = s.ToLower(CultureInfo.InvariantCulture).Trim();
Color c = (Color)WebColors.GetRGBColor(s);
if (c != null)
return c;
try {
if (s.StartsWith("#")) {
if (s.Length == 4)
s = "#" + s.Substring(1, 1) + s.Substring(1, 1)
+ s.Substring(2, 1) + s.Substring(2, 1)
+ s.Substring(3, 1) + s.Substring(3, 1);
if (s.Length == 7)
return new Color(int.Parse(s.Substring(1), NumberStyles.HexNumber));
}
else if (s.StartsWith("rgb")) {
StringTokenizer tk = new StringTokenizer(s.Substring(3), " \t\r\n\f(),");
int[] cc = new int [3];
for (int k = 0; k < 3; ++k) {
if (!tk.HasMoreTokens())
return null;
String t = tk.NextToken();
float n;
if (t.EndsWith("%")) {
n = float.Parse(t.Substring(0, t.Length - 1), System.Globalization.NumberFormatInfo.InvariantInfo);
n = n * 255f / 100f;
}
else
n = float.Parse(t, System.Globalization.NumberFormatInfo.InvariantInfo);
int ni = (int)n;
if (ni > 255)
ni = 255;
else if (ni < 0)
ni = 0;
cc[k] = ni;
}
return new Color(cc[0], cc[1], cc[2]);
}
}
catch {
}
return null;
}
/// <summary>
/// This method parses a string with attributes and returns a Properties object.
/// </summary>
/// <param name="str">a string of this form: 'key1="value1"; key2="value2";... keyN="valueN" '</param>
/// <returns>a Properties object</returns>
public static Properties ParseAttributes(string str) {
Properties result = new Properties();
if (str == null) return result;
StringTokenizer keyValuePairs = new StringTokenizer(str, ";");
StringTokenizer keyValuePair;
string key;
string value;
while (keyValuePairs.HasMoreTokens()) {
keyValuePair = new StringTokenizer(keyValuePairs.NextToken(), ":");
if (keyValuePair.HasMoreTokens()) key = keyValuePair.NextToken().Trim().Trim();
else continue;
if (keyValuePair.HasMoreTokens()) value = keyValuePair.NextToken().Trim();
else continue;
if (value.StartsWith("\"")) value = value.Substring(1);
if (value.EndsWith("\"")) value = value.Substring(0, value.Length - 1);
result.Add(key.ToLower(CultureInfo.InvariantCulture), value);
}
return result;
}
/**
* Removes the comments sections of a String.
*
* @param string
* the original String
* @param startComment
* the String that marks the start of a Comment section
* @param endComment
* the String that marks the end of a Comment section.
* @return the String stripped of its comment section
*/
public static string RemoveComment(String str, String startComment,
String endComment) {
StringBuilder result = new StringBuilder();
int pos = 0;
int end = endComment.Length;
int start = str.IndexOf(startComment, pos);
while (start > -1) {
result.Append(str.Substring(pos, start - pos));
pos = str.IndexOf(endComment, start) + end;
start = str.IndexOf(startComment, pos);
}
result.Append(str.Substring(pos));
return result.ToString();
}
}
}

View File

@@ -0,0 +1,263 @@
using System;
using System.Collections;
using System.Globalization;
using iTextSharp.text;
using System.util;
/*
* $Id: WebColors.cs,v 1.3 2008/05/13 11:25:16 psoares33 Exp $
*
*
* Copyright 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html {
/**
* This class is a HashMap that contains the names of colors as a key and the
* corresponding Color as value. (Source: Wikipedia
* http://en.wikipedia.org/wiki/Web_colors )
*
* @author blowagie
*/
public class WebColors : Hashtable {
public static WebColors NAMES = new WebColors();
static WebColors() {
NAMES["aliceblue"] = new int[] { 0xf0, 0xf8, 0xff, 0x00 };
NAMES["antiquewhite"] = new int[] { 0xfa, 0xeb, 0xd7, 0x00 };
NAMES["aqua"] = new int[] { 0x00, 0xff, 0xff, 0x00 };
NAMES["aquamarine"] = new int[] { 0x7f, 0xff, 0xd4, 0x00 };
NAMES["azure"] = new int[] { 0xf0, 0xff, 0xff, 0x00 };
NAMES["beige"] = new int[] { 0xf5, 0xf5, 0xdc, 0x00 };
NAMES["bisque"] = new int[] { 0xff, 0xe4, 0xc4, 0x00 };
NAMES["black"] = new int[] { 0x00, 0x00, 0x00, 0x00 };
NAMES["blanchedalmond"] = new int[] { 0xff, 0xeb, 0xcd, 0x00 };
NAMES["blue"] = new int[] { 0x00, 0x00, 0xff, 0x00 };
NAMES["blueviolet"] = new int[] { 0x8a, 0x2b, 0xe2, 0x00 };
NAMES["brown"] = new int[] { 0xa5, 0x2a, 0x2a, 0x00 };
NAMES["burlywood"] = new int[] { 0xde, 0xb8, 0x87, 0x00 };
NAMES["cadetblue"] = new int[] { 0x5f, 0x9e, 0xa0, 0x00 };
NAMES["chartreuse"] = new int[] { 0x7f, 0xff, 0x00, 0x00 };
NAMES["chocolate"] = new int[] { 0xd2, 0x69, 0x1e, 0x00 };
NAMES["coral"] = new int[] { 0xff, 0x7f, 0x50, 0x00 };
NAMES["cornflowerblue"] = new int[] { 0x64, 0x95, 0xed, 0x00 };
NAMES["cornsilk"] = new int[] { 0xff, 0xf8, 0xdc, 0x00 };
NAMES["crimson"] = new int[] { 0xdc, 0x14, 0x3c, 0x00 };
NAMES["cyan"] = new int[] { 0x00, 0xff, 0xff, 0x00 };
NAMES["darkblue"] = new int[] { 0x00, 0x00, 0x8b, 0x00 };
NAMES["darkcyan"] = new int[] { 0x00, 0x8b, 0x8b, 0x00 };
NAMES["darkgoldenrod"] = new int[] { 0xb8, 0x86, 0x0b, 0x00 };
NAMES["darkgray"] = new int[] { 0xa9, 0xa9, 0xa9, 0x00 };
NAMES["darkgreen"] = new int[] { 0x00, 0x64, 0x00, 0x00 };
NAMES["darkkhaki"] = new int[] { 0xbd, 0xb7, 0x6b, 0x00 };
NAMES["darkmagenta"] = new int[] { 0x8b, 0x00, 0x8b, 0x00 };
NAMES["darkolivegreen"] = new int[] { 0x55, 0x6b, 0x2f, 0x00 };
NAMES["darkorange"] = new int[] { 0xff, 0x8c, 0x00, 0x00 };
NAMES["darkorchid"] = new int[] { 0x99, 0x32, 0xcc, 0x00 };
NAMES["darkred"] = new int[] { 0x8b, 0x00, 0x00, 0x00 };
NAMES["darksalmon"] = new int[] { 0xe9, 0x96, 0x7a, 0x00 };
NAMES["darkseagreen"] = new int[] { 0x8f, 0xbc, 0x8f, 0x00 };
NAMES["darkslateblue"] = new int[] { 0x48, 0x3d, 0x8b, 0x00 };
NAMES["darkslategray"] = new int[] { 0x2f, 0x4f, 0x4f, 0x00 };
NAMES["darkturquoise"] = new int[] { 0x00, 0xce, 0xd1, 0x00 };
NAMES["darkviolet"] = new int[] { 0x94, 0x00, 0xd3, 0x00 };
NAMES["deeppink"] = new int[] { 0xff, 0x14, 0x93, 0x00 };
NAMES["deepskyblue"] = new int[] { 0x00, 0xbf, 0xff, 0x00 };
NAMES["dimgray"] = new int[] { 0x69, 0x69, 0x69, 0x00 };
NAMES["dodgerblue"] = new int[] { 0x1e, 0x90, 0xff, 0x00 };
NAMES["firebrick"] = new int[] { 0xb2, 0x22, 0x22, 0x00 };
NAMES["floralwhite"] = new int[] { 0xff, 0xfa, 0xf0, 0x00 };
NAMES["forestgreen"] = new int[] { 0x22, 0x8b, 0x22, 0x00 };
NAMES["fuchsia"] = new int[] { 0xff, 0x00, 0xff, 0x00 };
NAMES["gainsboro"] = new int[] { 0xdc, 0xdc, 0xdc, 0x00 };
NAMES["ghostwhite"] = new int[] { 0xf8, 0xf8, 0xff, 0x00 };
NAMES["gold"] = new int[] { 0xff, 0xd7, 0x00, 0x00 };
NAMES["goldenrod"] = new int[] { 0xda, 0xa5, 0x20, 0x00 };
NAMES["gray"] = new int[] { 0x80, 0x80, 0x80, 0x00 };
NAMES["green"] = new int[] { 0x00, 0x80, 0x00, 0x00 };
NAMES["greenyellow"] = new int[] { 0xad, 0xff, 0x2f, 0x00 };
NAMES["honeydew"] = new int[] { 0xf0, 0xff, 0xf0, 0x00 };
NAMES["hotpink"] = new int[] { 0xff, 0x69, 0xb4, 0x00 };
NAMES["indianred"] = new int[] { 0xcd, 0x5c, 0x5c, 0x00 };
NAMES["indigo"] = new int[] { 0x4b, 0x00, 0x82, 0x00 };
NAMES["ivory"] = new int[] { 0xff, 0xff, 0xf0, 0x00 };
NAMES["khaki"] = new int[] { 0xf0, 0xe6, 0x8c, 0x00 };
NAMES["lavender"] = new int[] { 0xe6, 0xe6, 0xfa, 0x00 };
NAMES["lavenderblush"] = new int[] { 0xff, 0xf0, 0xf5, 0x00 };
NAMES["lawngreen"] = new int[] { 0x7c, 0xfc, 0x00, 0x00 };
NAMES["lemonchiffon"] = new int[] { 0xff, 0xfa, 0xcd, 0x00 };
NAMES["lightblue"] = new int[] { 0xad, 0xd8, 0xe6, 0x00 };
NAMES["lightcoral"] = new int[] { 0xf0, 0x80, 0x80, 0x00 };
NAMES["lightcyan"] = new int[] { 0xe0, 0xff, 0xff, 0x00 };
NAMES["lightgoldenrodyellow"] = new int[] { 0xfa, 0xfa, 0xd2, 0x00 };
NAMES["lightgreen"] = new int[] { 0x90, 0xee, 0x90, 0x00 };
NAMES["lightgrey"] = new int[] { 0xd3, 0xd3, 0xd3, 0x00 };
NAMES["lightpink"] = new int[] { 0xff, 0xb6, 0xc1, 0x00 };
NAMES["lightsalmon"] = new int[] { 0xff, 0xa0, 0x7a, 0x00 };
NAMES["lightseagreen"] = new int[] { 0x20, 0xb2, 0xaa, 0x00 };
NAMES["lightskyblue"] = new int[] { 0x87, 0xce, 0xfa, 0x00 };
NAMES["lightslategray"] = new int[] { 0x77, 0x88, 0x99, 0x00 };
NAMES["lightsteelblue"] = new int[] { 0xb0, 0xc4, 0xde, 0x00 };
NAMES["lightyellow"] = new int[] { 0xff, 0xff, 0xe0, 0x00 };
NAMES["lime"] = new int[] { 0x00, 0xff, 0x00, 0x00 };
NAMES["limegreen"] = new int[] { 0x32, 0xcd, 0x32, 0x00 };
NAMES["linen"] = new int[] { 0xfa, 0xf0, 0xe6, 0x00 };
NAMES["magenta"] = new int[] { 0xff, 0x00, 0xff, 0x00 };
NAMES["maroon"] = new int[] { 0x80, 0x00, 0x00, 0x00 };
NAMES["mediumaquamarine"] = new int[] { 0x66, 0xcd, 0xaa, 0x00 };
NAMES["mediumblue"] = new int[] { 0x00, 0x00, 0xcd, 0x00 };
NAMES["mediumorchid"] = new int[] { 0xba, 0x55, 0xd3, 0x00 };
NAMES["mediumpurple"] = new int[] { 0x93, 0x70, 0xdb, 0x00 };
NAMES["mediumseagreen"] = new int[] { 0x3c, 0xb3, 0x71, 0x00 };
NAMES["mediumslateblue"] = new int[] { 0x7b, 0x68, 0xee, 0x00 };
NAMES["mediumspringgreen"] = new int[] { 0x00, 0xfa, 0x9a, 0x00 };
NAMES["mediumturquoise"] = new int[] { 0x48, 0xd1, 0xcc, 0x00 };
NAMES["mediumvioletred"] = new int[] { 0xc7, 0x15, 0x85, 0x00 };
NAMES["midnightblue"] = new int[] { 0x19, 0x19, 0x70, 0x00 };
NAMES["mintcream"] = new int[] { 0xf5, 0xff, 0xfa, 0x00 };
NAMES["mistyrose"] = new int[] { 0xff, 0xe4, 0xe1, 0x00 };
NAMES["moccasin"] = new int[] { 0xff, 0xe4, 0xb5, 0x00 };
NAMES["navajowhite"] = new int[] { 0xff, 0xde, 0xad, 0x00 };
NAMES["navy"] = new int[] { 0x00, 0x00, 0x80, 0x00 };
NAMES["oldlace"] = new int[] { 0xfd, 0xf5, 0xe6, 0x00 };
NAMES["olive"] = new int[] { 0x80, 0x80, 0x00, 0x00 };
NAMES["olivedrab"] = new int[] { 0x6b, 0x8e, 0x23, 0x00 };
NAMES["orange"] = new int[] { 0xff, 0xa5, 0x00, 0x00 };
NAMES["orangered"] = new int[] { 0xff, 0x45, 0x00, 0x00 };
NAMES["orchid"] = new int[] { 0xda, 0x70, 0xd6, 0x00 };
NAMES["palegoldenrod"] = new int[] { 0xee, 0xe8, 0xaa, 0x00 };
NAMES["palegreen"] = new int[] { 0x98, 0xfb, 0x98, 0x00 };
NAMES["paleturquoise"] = new int[] { 0xaf, 0xee, 0xee, 0x00 };
NAMES["palevioletred"] = new int[] { 0xdb, 0x70, 0x93, 0x00 };
NAMES["papayawhip"] = new int[] { 0xff, 0xef, 0xd5, 0x00 };
NAMES["peachpuff"] = new int[] { 0xff, 0xda, 0xb9, 0x00 };
NAMES["peru"] = new int[] { 0xcd, 0x85, 0x3f, 0x00 };
NAMES["pink"] = new int[] { 0xff, 0xc0, 0xcb, 0x00 };
NAMES["plum"] = new int[] { 0xdd, 0xa0, 0xdd, 0x00 };
NAMES["powderblue"] = new int[] { 0xb0, 0xe0, 0xe6, 0x00 };
NAMES["purple"] = new int[] { 0x80, 0x00, 0x80, 0x00 };
NAMES["red"] = new int[] { 0xff, 0x00, 0x00, 0x00 };
NAMES["rosybrown"] = new int[] { 0xbc, 0x8f, 0x8f, 0x00 };
NAMES["royalblue"] = new int[] { 0x41, 0x69, 0xe1, 0x00 };
NAMES["saddlebrown"] = new int[] { 0x8b, 0x45, 0x13, 0x00 };
NAMES["salmon"] = new int[] { 0xfa, 0x80, 0x72, 0x00 };
NAMES["sandybrown"] = new int[] { 0xf4, 0xa4, 0x60, 0x00 };
NAMES["seagreen"] = new int[] { 0x2e, 0x8b, 0x57, 0x00 };
NAMES["seashell"] = new int[] { 0xff, 0xf5, 0xee, 0x00 };
NAMES["sienna"] = new int[] { 0xa0, 0x52, 0x2d, 0x00 };
NAMES["silver"] = new int[] { 0xc0, 0xc0, 0xc0, 0x00 };
NAMES["skyblue"] = new int[] { 0x87, 0xce, 0xeb, 0x00 };
NAMES["slateblue"] = new int[] { 0x6a, 0x5a, 0xcd, 0x00 };
NAMES["slategray"] = new int[] { 0x70, 0x80, 0x90, 0x00 };
NAMES["snow"] = new int[] { 0xff, 0xfa, 0xfa, 0x00 };
NAMES["springgreen"] = new int[] { 0x00, 0xff, 0x7f, 0x00 };
NAMES["steelblue"] = new int[] { 0x46, 0x82, 0xb4, 0x00 };
NAMES["tan"] = new int[] { 0xd2, 0xb4, 0x8c, 0x00 };
NAMES["transparent"] = new int[] { 0x00, 0x00, 0x00, 0xff };
NAMES["teal"] = new int[] { 0x00, 0x80, 0x80, 0x00 };
NAMES["thistle"] = new int[] { 0xd8, 0xbf, 0xd8, 0x00 };
NAMES["tomato"] = new int[] { 0xff, 0x63, 0x47, 0x00 };
NAMES["turquoise"] = new int[] { 0x40, 0xe0, 0xd0, 0x00 };
NAMES["violet"] = new int[] { 0xee, 0x82, 0xee, 0x00 };
NAMES["wheat"] = new int[] { 0xf5, 0xde, 0xb3, 0x00 };
NAMES["white"] = new int[] { 0xff, 0xff, 0xff, 0x00 };
NAMES["whitesmoke"] = new int[] { 0xf5, 0xf5, 0xf5, 0x00 };
NAMES["yellow"] = new int[] { 0xff, 0xff, 0x00, 0x00 };
NAMES["yellowgreen"] = new int[] { 0x9, 0xacd, 0x32, 0x00 };
}
/**
* Gives you a Color based on a name.
*
* @param name
* a name such as black, violet, cornflowerblue or #RGB or #RRGGBB
* or rgb(R,G,B)
* @return the corresponding Color object
* @throws IllegalArgumentException
* if the String isn't a know representation of a color.
*/
public static Color GetRGBColor(String name) {
int[] c = { 0, 0, 0, 0 };
if (name.StartsWith("#")) {
if (name.Length == 4) {
c[0] = int.Parse(name.Substring(1, 1), NumberStyles.HexNumber) * 16;
c[1] = int.Parse(name.Substring(2, 1), NumberStyles.HexNumber) * 16;
c[2] = int.Parse(name.Substring(3), NumberStyles.HexNumber) * 16;
return new Color(c[0], c[1], c[2], c[3]);
}
if (name.Length == 7) {
c[0] = int.Parse(name.Substring(1, 2), NumberStyles.HexNumber);
c[1] = int.Parse(name.Substring(3, 2), NumberStyles.HexNumber);
c[2] = int.Parse(name.Substring(5), NumberStyles.HexNumber);
return new Color(c[0], c[1], c[2], c[3]);
}
throw new ArgumentException(
"Unknown color format. Must be #RGB or #RRGGBB");
}
else if (name.StartsWith("rgb(")) {
StringTokenizer tok = new StringTokenizer(name, "rgb(), \t\r\n\f");
for (int k = 0; k < 3; ++k) {
String v = tok.NextToken();
if (v.EndsWith("%"))
c[k] = int.Parse(v.Substring(0, v.Length - 1)) * 255 / 100;
else
c[k] = int.Parse(v);
if (c[k] < 0)
c[k] = 0;
else if (c[k] > 255)
c[k] = 255;
}
return new Color(c[0], c[1], c[2], c[3]);
}
name = name.ToLower(CultureInfo.InvariantCulture);
if (!NAMES.ContainsKey(name))
throw new ArgumentException("Color '" + name
+ "' not found.");
c = (int[]) NAMES[name];
return new Color(c[0], c[1], c[2], c[3]);
}
}
}

View File

@@ -0,0 +1,135 @@
using System;
using System.Collections;
/*
* Copyright 2004 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
public class ChainedProperties {
public static int[] fontSizes = {8, 10, 12, 14, 18, 24, 36};
public ArrayList chain = new ArrayList();
/** Creates a new instance of ChainedProperties */
public ChainedProperties() {
}
public String this[String key] {
get {
for (int k = chain.Count - 1; k >= 0; --k) {
Object[] obj = (Object[])chain[k];
Hashtable prop = (Hashtable)obj[1];
String ret = (String)prop[key];
if (ret != null)
return ret;
}
return null;
}
}
public bool HasProperty(String key) {
for (int k = chain.Count - 1; k >= 0; --k) {
Object[] obj = (Object[])chain[k];
Hashtable prop = (Hashtable)obj[1];
if (prop.ContainsKey(key))
return true;
}
return false;
}
public void AddToChain(String key, Hashtable prop) {
// adjust the font size
String value = (String)prop["size"];
if (value != null) {
if (value.EndsWith("px")) {
prop["size"] = value.Substring(0, value.Length - 2);
}
else {
int s = 0;
if (value.StartsWith("+") || value.StartsWith("-")) {
String old = this["basefontsize"];
if (old == null)
old = "12";
float f = float.Parse(old, System.Globalization.NumberFormatInfo.InvariantInfo);
int c = (int)f;
for (int k = fontSizes.Length - 1; k >= 0; --k) {
if (c >= fontSizes[k]) {
s = k;
break;
}
}
int inc = int.Parse(value.StartsWith("+") ? value.Substring(1) : value);
s += inc;
}
else {
try {
s = int.Parse(value) - 1;
}
catch {
s = 0;
}
}
if (s < 0)
s = 0;
else if (s >= fontSizes.Length)
s = fontSizes.Length - 1;
prop["size"] = fontSizes[s].ToString();
}
}
chain.Add(new Object[]{key, prop});
}
public void RemoveChain(String key) {
for (int k = chain.Count - 1; k >= 0; --k) {
if (key.Equals(((Object[])chain[k])[0])) {
chain.RemoveAt(k);
return;
}
}
}
}
}

View File

@@ -0,0 +1,338 @@
using System;
using System.Collections;
using System.Globalization;
using System.util;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html;
/*
* Copyright 2004 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
/**
*
* @author psoares
*/
public class FactoryProperties {
private FontFactoryImp fontImp = FontFactory.FontImp;
/** Creates a new instance of FactoryProperties */
public FactoryProperties() {
}
public Chunk CreateChunk(String text, ChainedProperties props) {
Font font = GetFont(props);
float size = font.Size;
size /= 2;
Chunk ck = new Chunk(text, font);
if (props.HasProperty("sub"))
ck.SetTextRise(-size);
else if (props.HasProperty("sup"))
ck.SetTextRise(size);
ck.SetHyphenation(GetHyphenation(props));
return ck;
}
private static void SetParagraphLeading(Paragraph p, String leading) {
if (leading == null) {
p.SetLeading(0, 1.5f);
return;
}
try {
StringTokenizer tk = new StringTokenizer(leading, " ,");
String v = tk.NextToken();
float v1 = float.Parse(v, System.Globalization.NumberFormatInfo.InvariantInfo);
if (!tk.HasMoreTokens()) {
p.SetLeading(v1, 0);
return;
}
v = tk.NextToken();
float v2 = float.Parse(v, System.Globalization.NumberFormatInfo.InvariantInfo);
p.SetLeading(v1, v2);
}
catch {
p.SetLeading(0, 1.5f);
}
}
public static Paragraph CreateParagraph(Hashtable props) {
Paragraph p = new Paragraph();
String value = (String)props["align"];
if (value != null) {
if (Util.EqualsIgnoreCase(value, "center"))
p.Alignment = Element.ALIGN_CENTER;
else if (Util.EqualsIgnoreCase(value, "right"))
p.Alignment = Element.ALIGN_RIGHT;
else if (Util.EqualsIgnoreCase(value, "justify"))
p.Alignment = Element.ALIGN_JUSTIFIED;
}
SetParagraphLeading(p, (String)props["leading"]);
p.Hyphenation = GetHyphenation(props);
return p;
}
public static void CreateParagraph(Paragraph p, ChainedProperties props) {
String value = props["align"];
if (value != null) {
if (Util.EqualsIgnoreCase(value, "center"))
p.Alignment = Element.ALIGN_CENTER;
else if (Util.EqualsIgnoreCase(value, "right"))
p.Alignment = Element.ALIGN_RIGHT;
else if (Util.EqualsIgnoreCase(value, "justify"))
p.Alignment = Element.ALIGN_JUSTIFIED;
}
p.Hyphenation = GetHyphenation(props);
SetParagraphLeading(p, props["leading"]);
value = props["before"];
if (value != null) {
try {
p.SpacingBefore = float.Parse(value, System.Globalization.NumberFormatInfo.InvariantInfo);
}
catch {}
}
value = props["after"];
if (value != null) {
try {
p.SpacingAfter = float.Parse(value, System.Globalization.NumberFormatInfo.InvariantInfo);
}
catch {}
}
value = props["extraparaspace"];
if (value != null) {
try {
p.ExtraParagraphSpace = float.Parse(value, System.Globalization.NumberFormatInfo.InvariantInfo);
}
catch {}
}
}
public static Paragraph CreateParagraph(ChainedProperties props) {
Paragraph p = new Paragraph();
CreateParagraph(p, props);
return p;
}
public static ListItem CreateListItem(ChainedProperties props) {
ListItem p = new ListItem();
CreateParagraph(p, props);
return p;
}
public Font GetFont(ChainedProperties props) {
String face = props["face"];
if (face != null) {
StringTokenizer tok = new StringTokenizer(face, ",");
while (tok.HasMoreTokens()) {
face = tok.NextToken().Trim();
if (face.StartsWith("\""))
face = face.Substring(1);
if (face.EndsWith("\""))
face = face.Substring(0, face.Length - 1);
if (fontImp.IsRegistered(face))
break;
}
}
int style = 0;
if (props.HasProperty("i"))
style |= Font.ITALIC;
if (props.HasProperty("b"))
style |= Font.BOLD;
if (props.HasProperty("u"))
style |= Font.UNDERLINE;
if (props.HasProperty("s"))
style |= Font.STRIKETHRU ;
String value = props["size"];
float size = 12;
if (value != null)
size = float.Parse(value, System.Globalization.NumberFormatInfo.InvariantInfo);
Color color = Markup.DecodeColor(props["color"]);
String encoding = props["encoding"];
if (encoding == null)
encoding = BaseFont.WINANSI;
return fontImp.GetFont(face, encoding, true, size, style, color);
}
/**
* Gets a HyphenationEvent based on the hyphenation entry in ChainedProperties.
* @param props ChainedProperties
* @return a HyphenationEvent
* @since 2.1.2
*/
public static IHyphenationEvent GetHyphenation(ChainedProperties props) {
return GetHyphenation(props["hyphenation"]);
}
/**
* Gets a HyphenationEvent based on the hyphenation entry in a HashMap.
* @param props a HashMap with properties
* @return a HyphenationEvent
* @since 2.1.2
*/
public static IHyphenationEvent GetHyphenation(Hashtable props) {
return GetHyphenation((String)props["hyphenation"]);
}
/**
* Gets a HyphenationEvent based on a String.
* For instance "en_UK,3,2" returns new HyphenationAuto("en", "UK", 3, 2);
* @param a String, for instance "en_UK,2,2"
* @return a HyphenationEvent
* @since 2.1.2
*/
public static IHyphenationEvent GetHyphenation(String s) {
if (s == null || s.Length == 0) {
return null;
}
String lang = s;
String country = null;
int leftMin = 2;
int rightMin = 2;
int pos = s.IndexOf('_');
if (pos == -1) {
return new HyphenationAuto(lang, country, leftMin, rightMin);
}
lang = s.Substring(0, pos);
country = s.Substring(pos + 1);
pos = country.IndexOf(',');
if (pos == -1) {
return new HyphenationAuto(lang, country, leftMin, rightMin);
}
s = country.Substring(pos + 1);
country = country.Substring(0, pos);
pos = s.IndexOf(',');
if (pos == -1) {
leftMin = int.Parse(s);
}
else {
leftMin = int.Parse(s.Substring(0, pos));
rightMin = int.Parse(s.Substring(pos + 1));
}
return new HyphenationAuto(lang, country, leftMin, rightMin);
}
public static void InsertStyle(Hashtable h) {
String style = (String)h["style"];
if (style == null)
return;
Properties prop = Markup.ParseAttributes(style);
foreach (String key in prop.Keys) {
if (key.Equals(Markup.CSS_KEY_FONTFAMILY)) {
h["face"] = prop[key];
}
else if (key.Equals(Markup.CSS_KEY_FONTSIZE)) {
h["size"] = Markup.ParseLength(prop[key]).ToString(NumberFormatInfo.InvariantInfo) + "px";
}
else if (key.Equals(Markup.CSS_KEY_FONTSTYLE)) {
String ss = prop[key].Trim().ToLower(CultureInfo.InvariantCulture);
if (ss.Equals("italic") || ss.Equals("oblique"))
h["i"] = null;
}
else if (key.Equals(Markup.CSS_KEY_FONTWEIGHT)) {
String ss = prop[key].Trim().ToLower(CultureInfo.InvariantCulture);
if (ss.Equals("bold") || ss.Equals("700") || ss.Equals("800") || ss.Equals("900"))
h["b"] = null;
}
else if (key.Equals(Markup.CSS_KEY_FONTWEIGHT)) {
String ss = prop[key].Trim().ToLower(CultureInfo.InvariantCulture);
if (ss.Equals("underline"))
h["u"] = null;
}
else if (key.Equals(Markup.CSS_KEY_COLOR)) {
Color c = Markup.DecodeColor(prop[key]);
if (c != null) {
int hh = c.ToArgb() & 0xffffff;
String hs = "#" + hh.ToString("X06", NumberFormatInfo.InvariantInfo);
h["color"] = hs;
}
}
else if (key.Equals(Markup.CSS_KEY_LINEHEIGHT)) {
String ss = prop[key].Trim();
float v = Markup.ParseLength(prop[key]);
if (ss.EndsWith("%")) {
v /= 100;
h["leading"] = "0," + v.ToString(NumberFormatInfo.InvariantInfo);
}
else {
h["leading"] = v.ToString(NumberFormatInfo.InvariantInfo) + ",0";
}
}
else if (key.Equals(Markup.CSS_KEY_TEXTALIGN)) {
String ss = prop[key].Trim().ToLower(System.Globalization.CultureInfo.InvariantCulture);
h["align"] = ss;
}
}
}
public FontFactoryImp FontImp {
get {
return fontImp;
}
set {
fontImp = value;
}
}
public static Hashtable followTags = new Hashtable();
static FactoryProperties() {
followTags["i"] = "i";
followTags["b"] = "b";
followTags["u"] = "u";
followTags["sub"] = "sub";
followTags["sup"] = "sup";
followTags["em"] = "i";
followTags["strong"] = "b";
followTags["s"] = "s";
followTags["strike"] = "s";
}
}
}

View File

@@ -0,0 +1,624 @@
using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Globalization;
using System.util;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.xml.simpleparser;
/*
* Copyright 2004 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
public class HTMLWorker : ISimpleXMLDocHandler, IDocListener {
protected ArrayList objectList;
protected IDocListener document;
private Paragraph currentParagraph;
private ChainedProperties cprops = new ChainedProperties();
private Stack stack = new Stack();
private bool pendingTR = false;
private bool pendingTD = false;
private bool pendingLI = false;
private StyleSheet style = new StyleSheet();
private bool isPRE = false;
private Stack tableState = new Stack();
private bool skipText = false;
private Hashtable interfaceProps;
private FactoryProperties factoryProperties = new FactoryProperties();
/** Creates a new instance of HTMLWorker */
public HTMLWorker(IDocListener document) {
this.document = document;
}
public StyleSheet Style {
set {
style = value;
}
get {
return style;
}
}
public Hashtable InterfaceProps {
set {
interfaceProps = value;
FontFactoryImp ff = null;
if (interfaceProps != null)
ff = (FontFactoryImp)interfaceProps["font_factory"];
if (ff != null)
factoryProperties.FontImp = ff;
}
get {
return interfaceProps;
}
}
public void Parse(TextReader reader) {
SimpleXMLParser.Parse(this, null, reader, true);
}
public static ArrayList ParseToList(TextReader reader, StyleSheet style) {
return ParseToList(reader, style, null);
}
public static ArrayList ParseToList(TextReader reader, StyleSheet style, Hashtable interfaceProps) {
HTMLWorker worker = new HTMLWorker(null);
if (style != null)
worker.Style = style;
worker.document = worker;
worker.InterfaceProps = interfaceProps;
worker.objectList = new ArrayList();
worker.Parse(reader);
return worker.objectList;
}
public virtual void EndDocument() {
foreach (IElement e in stack)
document.Add(e);
if (currentParagraph != null)
document.Add(currentParagraph);
currentParagraph = null;
}
public virtual void StartDocument() {
Hashtable h = new Hashtable();
style.ApplyStyle("body", h);
cprops.AddToChain("body", h);
}
public virtual void StartElement(String tag, Hashtable h) {
if (!tagsSupported.ContainsKey(tag))
return;
style.ApplyStyle(tag, h);
String follow = (String)FactoryProperties.followTags[tag];
if (follow != null) {
Hashtable prop = new Hashtable();
prop[follow] = null;
cprops.AddToChain(follow, prop);
return;
}
FactoryProperties.InsertStyle(h);
if (tag.Equals("a")) {
cprops.AddToChain(tag, h);
if (currentParagraph == null)
currentParagraph = new Paragraph();
stack.Push(currentParagraph);
currentParagraph = new Paragraph();
return;
}
if (tag.Equals("br")) {
if (currentParagraph == null)
currentParagraph = new Paragraph();
currentParagraph.Add(factoryProperties.CreateChunk("\n", cprops));
return;
}
if (tag.Equals("font") || tag.Equals("span")) {
cprops.AddToChain(tag, h);
return;
}
if (tag.Equals("img")) {
String src = (String)h["src"];
if (src == null)
return;
cprops.AddToChain(tag, h);
Image img = null;
if (interfaceProps != null) {
IImageProvider ip = (IImageProvider)interfaceProps["img_provider"];
if (ip != null)
img = ip.GetImage(src, h, cprops, document);
if (img == null) {
Hashtable images = (Hashtable)interfaceProps["img_static"];
if (images != null) {
Image tim = (Image)images[src];
if (tim != null)
img = Image.GetInstance(tim);
} else {
if (!src.StartsWith("http")) { // relative src references only
String baseurl = (String)interfaceProps["img_baseurl"];
if (baseurl != null) {
src = baseurl + src;
img = Image.GetInstance(src);
}
}
}
}
}
if (img == null) {
if (!src.StartsWith("http")) {
String path = cprops["image_path"];
if (path == null)
path = "";
src = Path.Combine(path, src);
}
img = Image.GetInstance(src);
}
String align = (String)h["align"];
String width = (String)h["width"];
String height = (String)h["height"];
String before = cprops["before"];
String after = cprops["after"];
if (before != null)
img.SpacingBefore = float.Parse(before, System.Globalization.NumberFormatInfo.InvariantInfo);
if (after != null)
img.SpacingAfter = float.Parse(after, System.Globalization.NumberFormatInfo.InvariantInfo);
float wp = LengthParse(width, (int)img.Width);
float lp = LengthParse(height, (int)img.Height);
if (wp > 0 && lp > 0)
img.ScalePercent(wp > lp ? lp : wp);
else if (wp > 0)
img.ScalePercent(wp);
else if (lp > 0)
img.ScalePercent(lp);
img.WidthPercentage = 0;
if (align != null) {
EndElement("p");
int ralign = Image.MIDDLE_ALIGN;
if (Util.EqualsIgnoreCase(align, "left"))
ralign = Image.LEFT_ALIGN;
else if (Util.EqualsIgnoreCase(align, "right"))
ralign = Image.RIGHT_ALIGN;
img.Alignment = ralign;
IImg i = null;
bool skip = false;
if (interfaceProps != null) {
i = (IImg)interfaceProps["img_interface"];
if (i != null)
skip = i.Process(img, h, cprops, document);
}
if (!skip)
document.Add(img);
cprops.RemoveChain(tag);
}
else {
cprops.RemoveChain(tag);
if (currentParagraph == null)
currentParagraph = FactoryProperties.CreateParagraph(cprops);
currentParagraph.Add(new Chunk(img, 0, 0));
}
return;
}
EndElement("p");
if (tag.Equals("h1") || tag.Equals("h2") || tag.Equals("h3") || tag.Equals("h4") || tag.Equals("h5") || tag.Equals("h6")) {
if (!h.ContainsKey("size")) {
int v = 7 - int.Parse(tag.Substring(1));
h["size"] = v.ToString();
}
cprops.AddToChain(tag, h);
return;
}
if (tag.Equals("ul")) {
if (pendingLI)
EndElement("li");
skipText = true;
cprops.AddToChain(tag, h);
List list = new List(false, 10);
list.SetListSymbol("\u2022");
stack.Push(list);
return;
}
if (tag.Equals("ol")) {
if (pendingLI)
EndElement("li");
skipText = true;
cprops.AddToChain(tag, h);
List list = new List(true, 10);
stack.Push(list);
return;
}
if (tag.Equals("li")) {
if (pendingLI)
EndElement("li");
skipText = false;
pendingLI = true;
cprops.AddToChain(tag, h);
stack.Push(FactoryProperties.CreateListItem(cprops));
return;
}
if (tag.Equals("div") || tag.Equals("body")) {
cprops.AddToChain(tag, h);
return;
}
if (tag.Equals("pre")) {
if (!h.ContainsKey("face")) {
h["face"] = "Courier";
}
cprops.AddToChain(tag, h);
isPRE = true;
return;
}
if (tag.Equals("p")) {
cprops.AddToChain(tag, h);
currentParagraph = FactoryProperties.CreateParagraph(h);
return;
}
if (tag.Equals("tr")) {
if (pendingTR)
EndElement("tr");
skipText = true;
pendingTR = true;
cprops.AddToChain("tr", h);
return;
}
if (tag.Equals("td") || tag.Equals("th")) {
if (pendingTD)
EndElement(tag);
skipText = false;
pendingTD = true;
cprops.AddToChain("td", h);
stack.Push(new IncCell(tag, cprops));
return;
}
if (tag.Equals("table")) {
cprops.AddToChain("table", h);
IncTable table = new IncTable(h);
stack.Push(table);
tableState.Push(new bool[]{pendingTR, pendingTD});
pendingTR = pendingTD = false;
skipText = true;
return;
}
}
public virtual void EndElement(String tag) {
if (!tagsSupported.ContainsKey(tag))
return;
String follow = (String)FactoryProperties.followTags[tag];
if (follow != null) {
cprops.RemoveChain(follow);
return;
}
if (tag.Equals("font") || tag.Equals("span")) {
cprops.RemoveChain(tag);
return;
}
if (tag.Equals("a")) {
if (currentParagraph == null)
currentParagraph = new Paragraph();
IALink i = null;
bool skip = false;
if (interfaceProps != null) {
i = (IALink)interfaceProps["alink_interface"];
if (i != null)
skip = i.Process(currentParagraph, cprops);
}
if (!skip) {
String href = cprops["href"];
if (href != null) {
ArrayList chunks = currentParagraph.Chunks;
for (int k = 0; k < chunks.Count; ++k) {
Chunk ck = (Chunk)chunks[k];
ck.SetAnchor(href);
}
}
}
Paragraph tmp = (Paragraph)stack.Pop();
Phrase tmp2 = new Phrase();
tmp2.Add(currentParagraph);
tmp.Add(tmp2);
currentParagraph = tmp;
cprops.RemoveChain("a");
return;
}
if (tag.Equals("br")) {
return;
}
if (currentParagraph != null) {
if (stack.Count == 0)
document.Add(currentParagraph);
else {
Object obj = stack.Pop();
if (obj is ITextElementArray) {
ITextElementArray current = (ITextElementArray)obj;
current.Add(currentParagraph);
}
stack.Push(obj);
}
}
currentParagraph = null;
if (tag.Equals("ul") || tag.Equals("ol")) {
if (pendingLI)
EndElement("li");
skipText = false;
cprops.RemoveChain(tag);
if (stack.Count == 0)
return;
Object obj = stack.Pop();
if (!(obj is List)) {
stack.Push(obj);
return;
}
if (stack.Count == 0)
document.Add((IElement)obj);
else
((ITextElementArray)stack.Peek()).Add(obj);
return;
}
if (tag.Equals("li")) {
pendingLI = false;
skipText = true;
cprops.RemoveChain(tag);
if (stack.Count == 0)
return;
Object obj = stack.Pop();
if (!(obj is ListItem)) {
stack.Push(obj);
return;
}
if (stack.Count == 0) {
document.Add((IElement)obj);
return;
}
Object list = stack.Pop();
if (!(list is List)) {
stack.Push(list);
return;
}
ListItem item = (ListItem)obj;
((List)list).Add(item);
ArrayList cks = item.Chunks;
if (cks.Count > 0)
item.ListSymbol.Font = ((Chunk)cks[0]).Font;
stack.Push(list);
return;
}
if (tag.Equals("div") || tag.Equals("body")) {
cprops.RemoveChain(tag);
return;
}
if (tag.Equals("pre")) {
cprops.RemoveChain(tag);
isPRE = false;
return;
}
if (tag.Equals("p")) {
cprops.RemoveChain(tag);
return;
}
if (tag.Equals("h1") || tag.Equals("h2") || tag.Equals("h3") || tag.Equals("h4") || tag.Equals("h5") || tag.Equals("h6")) {
cprops.RemoveChain(tag);
return;
}
if (tag.Equals("table")) {
if (pendingTR)
EndElement("tr");
cprops.RemoveChain("table");
IncTable table = (IncTable) stack.Pop();
PdfPTable tb = table.BuildTable();
tb.SplitRows = true;
if (stack.Count == 0)
document.Add(tb);
else
((ITextElementArray)stack.Peek()).Add(tb);
bool[] state = (bool[])tableState.Pop();
pendingTR = state[0];
pendingTD = state[1];
skipText = false;
return;
}
if (tag.Equals("tr")) {
if (pendingTD)
EndElement("td");
pendingTR = false;
cprops.RemoveChain("tr");
ArrayList cells = new ArrayList();
IncTable table = null;
while (true) {
Object obj = stack.Pop();
if (obj is IncCell) {
cells.Add(((IncCell)obj).Cell);
}
if (obj is IncTable) {
table = (IncTable)obj;
break;
}
}
table.AddCols(cells);
table.EndRow();
stack.Push(table);
skipText = true;
return;
}
if (tag.Equals("td") || tag.Equals("th")) {
pendingTD = false;
cprops.RemoveChain("td");
skipText = true;
return;
}
}
public virtual void Text(String str) {
if (skipText)
return;
String content = str;
if (isPRE) {
if (currentParagraph == null)
currentParagraph = FactoryProperties.CreateParagraph(cprops);
currentParagraph.Add(factoryProperties.CreateChunk(content, cprops));
return;
}
if (content.Trim().Length == 0 && content.IndexOf(' ') < 0) {
return;
}
StringBuilder buf = new StringBuilder();
int len = content.Length;
char character;
bool newline = false;
for (int i = 0; i < len; i++) {
switch (character = content[i]) {
case ' ':
if (!newline) {
buf.Append(character);
}
break;
case '\n':
if (i > 0) {
newline = true;
buf.Append(' ');
}
break;
case '\r':
break;
case '\t':
break;
default:
newline = false;
buf.Append(character);
break;
}
}
if (currentParagraph == null)
currentParagraph = FactoryProperties.CreateParagraph(cprops);
currentParagraph.Add(factoryProperties.CreateChunk(buf.ToString(), cprops));
}
public bool Add(IElement element) {
objectList.Add(element);
return true;
}
public void ClearTextWrap() {
}
public void Close() {
}
public bool NewPage() {
return true;
}
public void Open() {
}
public void ResetFooter() {
}
public void ResetHeader() {
}
public void ResetPageCount() {
}
public bool SetMarginMirroring(bool marginMirroring) {
return true;
}
public bool SetMargins(float marginLeft, float marginRight, float marginTop, float marginBottom) {
return true;
}
public bool SetPageSize(Rectangle pageSize) {
return true;
}
public const String tagsSupportedString = "ol ul li a pre font span br p div body table td th tr i b u sub sup em strong s strike"
+ " h1 h2 h3 h4 h5 h6 img";
public static Hashtable tagsSupported = new Hashtable();
static HTMLWorker() {
StringTokenizer tok = new StringTokenizer(tagsSupportedString);
while (tok.HasMoreTokens())
tagsSupported[tok.NextToken()] = null;
}
public HeaderFooter Footer {
set {
}
}
public HeaderFooter Header {
set {
}
}
public int PageCount {
set {
}
}
private static float LengthParse(String txt, int c) {
if (txt == null)
return -1;
if (txt.EndsWith("%")) {
float vf = float.Parse(txt.Substring(0, txt.Length - 1), System.Globalization.NumberFormatInfo.InvariantInfo);
return vf;
}
if (txt.EndsWith("px")) {
float vf = float.Parse(txt.Substring(0, txt.Length - 2), System.Globalization.NumberFormatInfo.InvariantInfo);
return vf;
}
int v = int.Parse(txt);
return (float)v / c * 100f;
}
}
}

View File

@@ -0,0 +1,54 @@
using System;
using iTextSharp.text;
/*
* Copyright 2005 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
public interface IALink {
bool Process(Paragraph current, ChainedProperties cprops);
}
}

View File

@@ -0,0 +1,55 @@
using System;
using System.Collections;
using iTextSharp.text;
/*
* Copyright 2007 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
public interface IImageProvider {
Image GetImage(String src, Hashtable h, ChainedProperties cprops, IDocListener doc);
}
}

View File

@@ -0,0 +1,55 @@
using System;
using System.Collections;
using iTextSharp.text;
/*
* Copyright 2005 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
public interface IImg {
bool Process(Image img, Hashtable h, ChainedProperties cprops, IDocListener doc);
}
}

View File

@@ -0,0 +1,153 @@
using System;
using System.Collections;
using System.util;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html;
/*
* Copyright 2004 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
/**
*
* @author psoares
*/
public class IncCell : ITextElementArray {
private ArrayList chunks = new ArrayList();
private PdfPCell cell;
/** Creates a new instance of IncCell */
public IncCell(String tag, ChainedProperties props) {
cell = new PdfPCell();
String value = props["colspan"];
if (value != null)
cell.Colspan = int.Parse(value);
value = props["align"];
if (tag.Equals("th"))
cell.HorizontalAlignment = Element.ALIGN_CENTER;
if (value != null) {
if (Util.EqualsIgnoreCase(value, "center"))
cell.HorizontalAlignment = Element.ALIGN_CENTER;
else if (Util.EqualsIgnoreCase(value, "right"))
cell.HorizontalAlignment = Element.ALIGN_RIGHT;
else if (Util.EqualsIgnoreCase(value, "left"))
cell.HorizontalAlignment = Element.ALIGN_LEFT;
else if (Util.EqualsIgnoreCase(value, "justify"))
cell.HorizontalAlignment = Element.ALIGN_JUSTIFIED;
}
value = props["valign"];
cell.VerticalAlignment = Element.ALIGN_MIDDLE;
if (value != null) {
if (Util.EqualsIgnoreCase(value, "top"))
cell.VerticalAlignment = Element.ALIGN_TOP;
else if (Util.EqualsIgnoreCase(value, "bottom"))
cell.VerticalAlignment = Element.ALIGN_BOTTOM;
}
value = props["border"];
float border = 0;
if (value != null)
border = float.Parse(value, System.Globalization.NumberFormatInfo.InvariantInfo);
cell.BorderWidth = border;
value = props["cellpadding"];
if (value != null)
cell.Padding = float.Parse(value, System.Globalization.NumberFormatInfo.InvariantInfo);
cell.UseDescender = true;
value = props["bgcolor"];
cell.BackgroundColor = Markup.DecodeColor(value);
}
public bool Add(Object o) {
if (!(o is IElement))
return false;
cell.AddElement((IElement)o);
return true;
}
public ArrayList Chunks {
get {
return chunks;
}
}
public bool Process(IElementListener listener) {
return true;
}
public int Type {
get {
return Element.RECTANGLE;
}
}
public PdfPCell Cell {
get {
return cell;
}
}
/**
* @see com.lowagie.text.Element#isContent()
* @since iText 2.0.8
*/
public bool IsContent() {
return true;
}
/**
* @see com.lowagie.text.Element#isNestable()
* @since iText 2.0.8
*/
public bool IsNestable() {
return true;
}
public override string ToString() {
return base.ToString();
}
}
}

View File

@@ -0,0 +1,124 @@
using System;
using System.Collections;
using iTextSharp.text;
using iTextSharp.text.pdf;
/*
* Copyright 2004 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
/**
*
* @author psoares
*/
public class IncTable {
private Hashtable props = new Hashtable();
private ArrayList rows = new ArrayList();
private ArrayList cols;
/** Creates a new instance of IncTable */
public IncTable(Hashtable props) {
foreach (DictionaryEntry dc in props)
this.props[dc.Key] = dc.Value;
}
public void AddCol(PdfPCell cell) {
if (cols == null)
cols = new ArrayList();
cols.Add(cell);
}
public void AddCols(ArrayList ncols) {
if (cols == null)
cols = new ArrayList(ncols);
else
cols.AddRange(ncols);
}
public void EndRow() {
if (cols != null) {
cols.Reverse();
rows.Add(cols);
cols = null;
}
}
public ArrayList Rows {
get {
return rows;
}
}
public PdfPTable BuildTable() {
if (rows.Count == 0)
return new PdfPTable(1);
int ncol = 0;
ArrayList c0 = (ArrayList)rows[0];
for (int k = 0; k < c0.Count; ++k) {
ncol += ((PdfPCell)c0[k]).Colspan;
}
PdfPTable table = new PdfPTable(ncol);
String width = (String)props["width"];
if (width == null)
table.WidthPercentage = 100;
else {
if (width.EndsWith("%"))
table.WidthPercentage = float.Parse(width.Substring(0, width.Length - 1), System.Globalization.NumberFormatInfo.InvariantInfo);
else {
table.TotalWidth = float.Parse(width, System.Globalization.NumberFormatInfo.InvariantInfo);
table.LockedWidth = true;
}
}
for (int row = 0; row < rows.Count; ++row) {
ArrayList col = (ArrayList)rows[row];
for (int k = 0; k < col.Count; ++k) {
table.AddCell((PdfPCell)col[k]);
}
}
return table;
}
}
}

View File

@@ -0,0 +1,117 @@
using System;
using System.Collections;
/*
* Copyright 2004 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
namespace iTextSharp.text.html.simpleparser {
public class StyleSheet {
public Hashtable classMap = new Hashtable();
public Hashtable tagMap = new Hashtable();
/** Creates a new instance of StyleSheet */
public StyleSheet() {
}
public void ApplyStyle(String tag, Hashtable props) {
Hashtable map = (Hashtable)tagMap[tag.ToLower(System.Globalization.CultureInfo.InvariantCulture)];
Hashtable temp;
if (map != null) {
temp = new Hashtable(map);
foreach (DictionaryEntry dc in props)
temp[dc.Key] = dc.Value;
foreach (DictionaryEntry dc in temp)
props[dc.Key] = dc.Value;
}
String cm = (String)props["class"];
if (cm == null)
return;
map = (Hashtable)classMap[cm.ToLower(System.Globalization.CultureInfo.InvariantCulture)];
if (map == null)
return;
props.Remove("class");
temp = new Hashtable(map);
foreach (DictionaryEntry dc in props)
temp[dc.Key] = dc.Value;
foreach (DictionaryEntry dc in temp)
props[dc.Key] = dc.Value;
}
private void ApplyMap(Hashtable map, Hashtable props) {
}
public void LoadStyle(String style, Hashtable props) {
classMap[style.ToLower(System.Globalization.CultureInfo.InvariantCulture)] = props;
}
public void LoadStyle(String style, String key, String value) {
style = style.ToLower(System.Globalization.CultureInfo.InvariantCulture);
Hashtable props = (Hashtable)classMap[style];
if (props == null) {
props = new Hashtable();
classMap[style] = props;
}
props[key] = value;
}
public void LoadTagStyle(String tag, Hashtable props) {
tagMap[tag.ToLower(System.Globalization.CultureInfo.InvariantCulture)] = props;
}
public void LoadTagStyle(String tag, String key, String value) {
tag = tag.ToLower(System.Globalization.CultureInfo.InvariantCulture);
Hashtable props = (Hashtable)tagMap[tag];
if (props == null) {
props = new Hashtable();
tagMap[tag] = props;
}
props[key] = value;
}
}
}