Ejemplo n.º 1
0
 /** Creates a new font. This font can be one of the 14 built in types,
 * a Type1 font referred to by an AFM or PFM file, a TrueType font (simple or collection) or a CJK font from the
 * Adobe Asian Font Pack. TrueType fonts and CJK fonts can have an optional style modifier
 * appended to the name. These modifiers are: Bold, Italic and BoldItalic. An
 * example would be "STSong-Light,Bold". Note that this modifiers do not work if
 * the font is embedded. Fonts in TrueType collections are addressed by index such as "msgothic.ttc,1".
 * This would get the second font (indexes start at 0), in this case "MS PGothic".
 * <P>
 * The fonts may or may not be cached depending on the flag <CODE>cached</CODE>.
 * If the <CODE>byte</CODE> arrays are present the font will be
 * read from them instead of the name. A name is still required to identify
 * the font type.
 * <P>
 * Besides the common encodings described by name, custom encodings 
 * can also be made. These encodings will only work for the single byte fonts
 * Type1 and TrueType. The encoding string starts with a '#'
 * followed by "simple" or "full". If "simple" there is a decimal for the first character position and then a list
 * of hex values representing the Unicode codes that compose that encoding.<br>
 * The "simple" encoding is recommended for TrueType fonts
 * as the "full" encoding risks not matching the character with the right glyph
 * if not done with care.<br>
 * The "full" encoding is specially aimed at Type1 fonts where the glyphs have to be
 * described by non standard names like the Tex math fonts. Each group of three elements
 * compose a code position: the one byte code order in decimal or as 'x' (x cannot be the space), the name and the Unicode character
 * used to access the glyph. The space must be assigned to character position 32 otherwise
 * text justification will not work.
 * <P>
 * Example for a "simple" encoding that includes the Unicode
 * character space, A, B and ecyrillic:
 * <PRE>
 * "# simple 32 0020 0041 0042 0454"
 * </PRE>
 * <P>
 * Example for a "full" encoding for a Type1 Tex font:
 * <PRE>
 * "# full 'A' nottriangeqlleft 0041 'B' dividemultiply 0042 32 space 0020"
 * </PRE>
 * @param name the name of the font or its location on file
 * @param encoding the encoding to be applied to this font
 * @param embedded true if the font is to be embedded in the PDF
 * @param cached true if the font comes from the cache or is added to
 * the cache if new, false if the font is always created new
 * @param ttfAfm the true type font or the afm in a byte array
 * @param pfb the pfb in a byte array
 * @param noThrow if true will not throw an exception if the font is not recognized and will return null, if false will throw
 * an exception if the font is not recognized. Note that even if true an exception may be thrown in some circumstances.
 * This parameter is useful for FontFactory that may have to check many invalid font names before finding the right one
 * @param   forceRead   in some cases (TrueTypeFont, Type1Font), the full font file will be read and kept in memory if forceRead is true
 * @return returns a new font. This font may come from the cache but only if cached
 * is true, otherwise it will always be created new
 * @throws DocumentException the font is invalid
 * @throws IOException the font file could not be read
 * @since   2.1.5
 */
 public static BaseFont CreateFont(String name, String encoding, bool embedded, bool cached, byte[] ttfAfm, byte[] pfb, bool noThrow, bool forceRead) {
     string nameBase = GetBaseName(name);
     encoding = NormalizeEncoding(encoding);
     bool isBuiltinFonts14 = BuiltinFonts14.ContainsKey(name);
     bool isCJKFont = isBuiltinFonts14 ? false : CJKFont.IsCJKFont(nameBase, encoding);
     if (isBuiltinFonts14 || isCJKFont)
         embedded = false;
     else if (encoding.Equals(IDENTITY_H) || encoding.Equals(IDENTITY_V))
         embedded = true;
     BaseFont fontFound = null;
     BaseFont fontBuilt = null;
     string key = name + "\n" + encoding + "\n" + embedded;
     if (cached) {
         lock (fontCache) {
              fontCache.TryGetValue(key, out fontFound);
         }
         if (fontFound != null)
             return fontFound;
     }
     if (isBuiltinFonts14 || name.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".afm") || name.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".pfm")) {
         fontBuilt = new Type1Font(name, encoding, embedded, ttfAfm, pfb, forceRead);
         fontBuilt.fastWinansi = encoding.Equals(CP1252);
     }
     else if (nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttf") || nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".otf") || nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).IndexOf(".ttc,") > 0) {
         if (encoding.Equals(IDENTITY_H) || encoding.Equals(IDENTITY_V))
             fontBuilt = new TrueTypeFontUnicode(name, encoding, embedded, ttfAfm, forceRead);
         else {
             fontBuilt = new TrueTypeFont(name, encoding, embedded, ttfAfm, false, forceRead);
             fontBuilt.fastWinansi = encoding.Equals(CP1252);
         }
     }
     else if (isCJKFont)
         fontBuilt = new CJKFont(name, encoding, embedded);
     else if (noThrow)
         return null;
     else
         throw new DocumentException(MessageLocalization.GetComposedMessage("font.1.with.2.is.not.recognized", name, encoding));
     if (cached) {
         lock (fontCache) {
             fontCache.TryGetValue(key, out fontFound);
             if (fontFound != null)
                 return fontFound;
             fontCache[key] = fontBuilt;
         }
     }
     return fontBuilt;
 }
Ejemplo n.º 2
0
 /** Gets all the entries of the namestable from the font. Only the required tables are read.
 * @param name the name of the font
 * @param encoding the encoding of the font
 * @param ttfAfm the true type font or the afm in a byte array
 * @throws DocumentException on error
 * @throws IOException on error
 * @return an array of Object[] built with {getPostscriptFontName(), getFamilyFontName(), getFullFontName()}
 */
 public static String[][] GetAllNameEntries(String name, String encoding, byte[] ttfAfm) {
     String nameBase = GetBaseName(name);
     BaseFont fontBuilt = null;
     if (nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttf") || nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".otf") || nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).IndexOf(".ttc,") > 0)
         fontBuilt = new TrueTypeFont(name, CP1252, false, ttfAfm, true, false);
     else
         fontBuilt = CreateFont(name, encoding, false, false, ttfAfm, null);
     return fontBuilt.AllNameEntries;
 }
Ejemplo n.º 3
0
 /** Gets the full name of the font. If it is a True Type font
  * each array element will have {Platform ID, Platform Encoding ID,
  * Language ID, font name}. The interpretation of this values can be
  * found in the Open Type specification, chapter 2, in the 'name' table.<br>
  * For the other fonts the array has a single element with {"", "", "",
  * font name}.
  * @param name the name of the font
  * @param encoding the encoding of the font
  * @param ttfAfm the true type font or the afm in a byte array
  * @throws DocumentException on error
  * @throws IOException on error
  * @return the full name of the font
  */
 public static string[][] GetFullFontName(string name, string encoding, byte[] ttfAfm)
 {
     string nameBase = GetBaseName(name);
     BaseFont fontBuilt = null;
     if (nameBase.ToLower().EndsWith(".ttf") || nameBase.ToLower().EndsWith(".otf") || nameBase.ToLower().IndexOf(".ttc,") > 0)
         fontBuilt = new TrueTypeFont(name, CP1252, false, ttfAfm, true);
     else
         fontBuilt = CreateFont(name, encoding, false, false, ttfAfm, null);
     return fontBuilt.FullFontName;
 }
Ejemplo n.º 4
0
 /** Gets all the names from the font. Only the required tables are read.
 * @param name the name of the font
 * @param encoding the encoding of the font
 * @param ttfAfm the true type font or the afm in a byte array
 * @throws DocumentException on error
 * @throws IOException on error
 * @return an array of Object[] built with {getPostscriptFontName(), GetFamilyFontName(), GetFullFontName()}
 */    
 public static Object[] GetAllFontNames(String name, String encoding, byte[] ttfAfm) {
     String nameBase = GetBaseName(name);
     BaseFont fontBuilt = null;
     if (nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".ttf") || nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).EndsWith(".otf") || nameBase.ToLower(System.Globalization.CultureInfo.InvariantCulture).IndexOf(".ttc,") > 0)
         fontBuilt = new TrueTypeFont(name, CP1252, false, ttfAfm, true, false);
     else
         fontBuilt = CreateFont(name, encoding, false, false, ttfAfm, null);
     return new Object[]{fontBuilt.PostscriptFontName, fontBuilt.FamilyFontName, fontBuilt.FullFontName};
 }
Ejemplo n.º 5
0
 /** Creates a new font. This font can be one of the 14 built in types,
 * a Type1 font referred to by an AFM or PFM file, a TrueType font (simple or collection) or a CJK font from the
 * Adobe Asian Font Pack. TrueType fonts and CJK fonts can have an optional style modifier
 * appended to the name. These modifiers are: Bold, Italic and BoldItalic. An
 * example would be "STSong-Light,Bold". Note that this modifiers do not work if
 * the font is embedded. Fonts in TrueType collections are addressed by index such as "msgothic.ttc,1".
 * This would get the second font (indexes start at 0), in this case "MS PGothic".
 * <P>
 * The fonts may or may not be cached depending on the flag <CODE>cached</CODE>.
 * If the <CODE>byte</CODE> arrays are present the font will be
 * read from them instead of the name. A name is still required to identify
 * the font type.
 * <P>
 * Besides the common encodings described by name, custom encodings
 * can also be made. These encodings will only work for the single byte fonts
 * Type1 and TrueType. The encoding string starts with a '#'
 * followed by "simple" or "full". If "simple" there is a decimal for the first character position and then a list
 * of hex values representing the Unicode codes that compose that encoding.<br>
 * The "simple" encoding is recommended for TrueType fonts
 * as the "full" encoding risks not matching the character with the right glyph
 * if not done with care.<br>
 * The "full" encoding is specially aimed at Type1 fonts where the glyphs have to be
 * described by non standard names like the Tex math fonts. Each group of three elements
 * compose a code position: the one byte code order in decimal or as 'x' (x cannot be the space), the name and the Unicode character
 * used to access the glyph. The space must be assigned to character position 32 otherwise
 * text justification will not work.
 * <P>
 * Example for a "simple" encoding that includes the Unicode
 * character space, A, B and ecyrillic:
 * <PRE>
 * "# simple 32 0020 0041 0042 0454"
 * </PRE>
 * <P>
 * Example for a "full" encoding for a Type1 Tex font:
 * <PRE>
 * "# full 'A' nottriangeqlleft 0041 'B' dividemultiply 0042 32 space 0020"
 * </PRE>
 * @param name the name of the font or it's location on file
 * @param encoding the encoding to be applied to this font
 * @param embedded true if the font is to be embedded in the PDF
 * @param cached true if the font comes from the cache or is added to
 * the cache if new, false if the font is always created new
 * @param ttfAfm the true type font or the afm in a byte array
 * @param pfb the pfb in a byte array
 * @return returns a new font. This font may come from the cache but only if cached
 * is true, otherwise it will always be created new
 * @throws DocumentException the font is invalid
 * @throws IOException the font file could not be read
 */
 public static BaseFont CreateFont(string name, string encoding, bool embedded, bool cached, byte[] ttfAfm, byte[] pfb)
 {
     string nameBase = GetBaseName(name);
     encoding = NormalizeEncoding(encoding);
     bool isBuiltinFonts14 = BuiltinFonts14.ContainsKey(name);
     bool isCJKFont = isBuiltinFonts14 ? false : CJKFont.IsCJKFont(nameBase, encoding);
     if (isBuiltinFonts14 || isCJKFont)
         embedded = false;
     else if (encoding.Equals(IDENTITY_H) || encoding.Equals(IDENTITY_V))
         embedded = true;
     BaseFont fontFound = null;
     BaseFont fontBuilt = null;
     string key = name + "\n" + encoding + "\n" + embedded;
     if (cached) {
         lock (fontCache) {
             fontFound = (BaseFont)fontCache[key];
         }
         if (fontFound != null)
             return fontFound;
     }
     if (isBuiltinFonts14 || name.ToLower().EndsWith(".afm") || name.ToLower().EndsWith(".pfm")) {
         fontBuilt = new Type1Font(name, encoding, embedded, ttfAfm, pfb);
         fontBuilt.fastWinansi = encoding.Equals(CP1252);
     }
     else if (nameBase.ToLower().EndsWith(".ttf") || nameBase.ToLower().EndsWith(".otf") || nameBase.ToLower().IndexOf(".ttc,") > 0) {
         if (encoding.Equals(IDENTITY_H) || encoding.Equals(IDENTITY_V))
             fontBuilt = new TrueTypeFontUnicode(name, encoding, embedded, ttfAfm);
         else {
             fontBuilt = new TrueTypeFont(name, encoding, embedded, ttfAfm);
             fontBuilt.fastWinansi = encoding.Equals(CP1252);
         }
     }
     else if (isCJKFont)
         fontBuilt = new CJKFont(name, encoding, embedded);
     else
         throw new DocumentException("Font '" + name + "' with '" + encoding + "' is not recognized.");
     if (cached) {
         lock (fontCache) {
             fontFound = (BaseFont)fontCache[key];
             if (fontFound != null)
                 return fontFound;
             fontCache.Add(key, fontBuilt);
         }
     }
     return fontBuilt;
 }