コード例 #1
0
        protected internal virtual void FillCustomEncoding()
        {
            differences = new String[256];
            StringTokenizer tok = new StringTokenizer(baseEncoding.Substring(1), " ,\t\n\r\f");

            if (tok.NextToken().Equals("full"))
            {
                while (tok.HasMoreTokens())
                {
                    String order   = tok.NextToken();
                    String name    = tok.NextToken();
                    char   uni     = (char)Convert.ToInt32(tok.NextToken(), 16);
                    int    uniName = AdobeGlyphList.NameToUnicode(name);
                    int    orderK;
                    if (order.StartsWith("'"))
                    {
                        orderK = order[1];
                    }
                    else
                    {
                        orderK = Convert.ToInt32(order);
                    }
                    orderK %= 256;
                    unicodeToCode.Put(uni, orderK);
                    codeToUnicode[orderK] = (int)uni;
                    differences[orderK]   = name;
                    unicodeDifferences.Put(uni, uniName);
                }
            }
            else
            {
                int k = 0;
                if (tok.HasMoreTokens())
                {
                    k = Convert.ToInt32(tok.NextToken());
                }
                while (tok.HasMoreTokens() && k < 256)
                {
                    String hex  = tok.NextToken();
                    int    uni  = Convert.ToInt32(hex, 16) % 0x10000;
                    String name = AdobeGlyphList.UnicodeToName(uni);
                    if (name == null)
                    {
                        name = "uni" + hex;
                    }
                    unicodeToCode.Put(uni, k);
                    codeToUnicode[k] = uni;
                    differences[k]   = name;
                    unicodeDifferences.Put(uni, uni);
                    k++;
                }
            }
            for (int k = 0; k < 256; k++)
            {
                if (differences[k] == null)
                {
                    differences[k] = NOTDEF;
                }
            }
        }
コード例 #2
0
 protected internal virtual void FillNamedEncoding() {
     PdfEncodings.ConvertToBytes(" ", baseEncoding);
     // check if the encoding exists
     bool stdEncoding = PdfEncodings.WINANSI.Equals(baseEncoding) || PdfEncodings.MACROMAN.Equals(baseEncoding);
     if (!stdEncoding && differences == null) {
         differences = new String[256];
     }
     byte[] b = new byte[256];
     for (int k = 0; k < 256; ++k) {
         b[k] = (byte)k;
     }
     String str = PdfEncodings.ConvertToString(b, baseEncoding);
     char[] encoded = str.ToCharArray();
     for (int ch = 0; ch < 256; ++ch) {
         char uni = encoded[ch];
         String name = AdobeGlyphList.UnicodeToName(uni);
         if (name == null) {
             name = FontConstants.notdef;
         }
         else {
             unicodeToCode.Put(uni, ch);
             codeToUnicode[ch] = (int)uni;
             unicodeDifferences.Put(uni, uni);
         }
         if (differences != null) {
             differences[ch] = name;
         }
     }
 }
コード例 #3
0
        /// <summary>Find glyph by glyph name.</summary>
        /// <param name="name">Glyph name</param>
        /// <returns>Glyph instance if found, otherwise null.</returns>
        public virtual Glyph GetGlyph(String name)
        {
            int unicode = AdobeGlyphList.NameToUnicode(name);

            if (unicode != -1)
            {
                return(GetGlyph((int)unicode));
            }
            else
            {
                return(null);
            }
        }
コード例 #4
0
 public virtual bool AddSymbol(int code, int unicode) {
     if (code < 0 || code > 255) {
         return false;
     }
     String glyphName = AdobeGlyphList.UnicodeToName(unicode);
     if (glyphName != null) {
         unicodeToCode.Put(unicode, code);
         codeToUnicode[code] = unicode;
         differences[code] = glyphName;
         unicodeDifferences.Put(unicode, unicode);
         return true;
     }
     else {
         return false;
     }
 }
コード例 #5
0
 protected internal virtual void FillStandardEncoding() {
     int[] encoded = PdfEncodings.standardEncoding;
     for (int ch = 0; ch < 256; ++ch) {
         int uni = encoded[ch];
         String name = AdobeGlyphList.UnicodeToName(uni);
         if (name == null) {
             name = FontConstants.notdef;
         }
         else {
             unicodeToCode.Put(uni, ch);
             codeToUnicode[ch] = uni;
             unicodeDifferences.Put(uni, uni);
         }
         if (differences != null) {
             differences[ch] = name;
         }
     }
 }
コード例 #6
0
        protected internal virtual void Process()
        {
            RandomAccessFileOrArray raf = fontParser.GetMetricsFile();
            String line;
            bool   startKernPairs = false;

            while (!startKernPairs && (line = raf.ReadLine()) != null)
            {
                StringTokenizer tok = new StringTokenizer(line, " ,\n\r\t\f");
                if (!tok.HasMoreTokens())
                {
                    continue;
                }
                String ident = tok.NextToken();
                switch (ident)
                {
                case "FontName": {
                    fontNames.SetFontName(tok.NextToken("\u00ff").Substring(1));
                    break;
                }

                case "FullName": {
                    String fullName = tok.NextToken("\u00ff").Substring(1);
                    fontNames.SetFullName(new String[][] { new String[] { "", "", "", fullName } });
                    break;
                }

                case "FamilyName": {
                    String familyName = tok.NextToken("\u00ff").Substring(1);
                    fontNames.SetFamilyName(new String[][] { new String[] { "", "", "", familyName } });
                    break;
                }

                case "Weight": {
                    fontNames.SetFontWeight(FontWeights.FromType1FontWeight(tok.NextToken("\u00ff").Substring(1)));
                    break;
                }

                case "ItalicAngle": {
                    fontMetrics.SetItalicAngle(float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture)
                                               );
                    break;
                }

                case "IsFixedPitch": {
                    fontMetrics.SetIsFixedPitch(tok.NextToken().Equals("true"));
                    break;
                }

                case "CharacterSet": {
                    characterSet = tok.NextToken("\u00ff").Substring(1);
                    break;
                }

                case "FontBBox": {
                    int llx = (int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture);
                    int lly = (int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture);
                    int urx = (int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture);
                    int ury = (int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture);
                    fontMetrics.SetBbox(llx, lly, urx, ury);
                    break;
                }

                case "UnderlinePosition": {
                    fontMetrics.SetUnderlinePosition((int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture
                                                                      ));
                    break;
                }

                case "UnderlineThickness": {
                    fontMetrics.SetUnderlineThickness((int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture
                                                                       ));
                    break;
                }

                case "EncodingScheme": {
                    encodingScheme = tok.NextToken("\u00ff").Substring(1).Trim();
                    break;
                }

                case "CapHeight": {
                    fontMetrics.SetCapHeight((int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture
                                                              ));
                    break;
                }

                case "XHeight": {
                    fontMetrics.SetXHeight((int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture
                                                            ));
                    break;
                }

                case "Ascender": {
                    fontMetrics.SetTypoAscender((int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture
                                                                 ));
                    break;
                }

                case "Descender": {
                    fontMetrics.SetTypoDescender((int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture
                                                                  ));
                    break;
                }

                case "StdHW": {
                    fontMetrics.SetStemH((int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture));
                    break;
                }

                case "StdVW": {
                    fontMetrics.SetStemV((int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture));
                    break;
                }

                case "StartCharMetrics": {
                    startKernPairs = true;
                    break;
                }
                }
            }
            if (!startKernPairs)
            {
                String metricsPath = fontParser.GetAfmPath();
                if (metricsPath != null)
                {
                    throw new iText.IO.IOException("startcharmetrics is missing in {0}.").SetMessageParams(metricsPath);
                }
                else
                {
                    throw new iText.IO.IOException("startcharmetrics is missing in the metrics file.");
                }
            }
            avgWidth = 0;
            int widthCount = 0;

            while ((line = raf.ReadLine()) != null)
            {
                StringTokenizer tok = new StringTokenizer(line);
                if (!tok.HasMoreTokens())
                {
                    continue;
                }
                String ident = tok.NextToken();
                if (ident.Equals("EndCharMetrics"))
                {
                    startKernPairs = false;
                    break;
                }
                int    C  = -1;
                int    WX = 250;
                String N  = "";
                int[]  B  = null;
                tok = new StringTokenizer(line, ";");
                while (tok.HasMoreTokens())
                {
                    StringTokenizer tokc = new StringTokenizer(tok.NextToken());
                    if (!tokc.HasMoreTokens())
                    {
                        continue;
                    }
                    ident = tokc.NextToken();
                    switch (ident)
                    {
                    case "C": {
                        C = Convert.ToInt32(tokc.NextToken());
                        break;
                    }

                    case "WX": {
                        WX = (int)float.Parse(tokc.NextToken(), System.Globalization.CultureInfo.InvariantCulture);
                        break;
                    }

                    case "N": {
                        N = tokc.NextToken();
                        break;
                    }

                    case "B": {
                        B = new int[] { Convert.ToInt32(tokc.NextToken()), Convert.ToInt32(tokc.NextToken()), Convert.ToInt32(tokc
                                                                                                                              .NextToken()), Convert.ToInt32(tokc.NextToken()) };
                        break;
                    }
                    }
                }
                int   unicode = AdobeGlyphList.NameToUnicode(N);
                Glyph glyph   = new Glyph(C, WX, unicode, B);
                if (C >= 0)
                {
                    codeToGlyph.Put(C, glyph);
                }
                if (unicode != -1)
                {
                    unicodeToGlyph.Put(unicode, glyph);
                }
                avgWidth += WX;
                widthCount++;
            }
            if (widthCount != 0)
            {
                avgWidth /= widthCount;
            }
            if (startKernPairs)
            {
                String metricsPath = fontParser.GetAfmPath();
                if (metricsPath != null)
                {
                    throw new iText.IO.IOException("endcharmetrics is missing in {0}.").SetMessageParams(metricsPath);
                }
                else
                {
                    throw new iText.IO.IOException("endcharmetrics is missing in the metrics file.");
                }
            }
            // From AdobeGlyphList:
            // nonbreakingspace;00A0
            // space;0020
            if (!unicodeToGlyph.ContainsKey(0x00A0))
            {
                Glyph space = unicodeToGlyph.Get(0x0020);
                if (space != null)
                {
                    unicodeToGlyph.Put(0x00A0, new Glyph(space.GetCode(), space.GetWidth(), 0x00A0, space.GetBbox()));
                }
            }
            bool endOfMetrics = false;

            while ((line = raf.ReadLine()) != null)
            {
                StringTokenizer tok = new StringTokenizer(line);
                if (!tok.HasMoreTokens())
                {
                    continue;
                }
                String ident = tok.NextToken();
                if (ident.Equals("EndFontMetrics"))
                {
                    endOfMetrics = true;
                    break;
                }
                else
                {
                    if (ident.Equals("StartKernPairs"))
                    {
                        startKernPairs = true;
                        break;
                    }
                }
            }
            if (startKernPairs)
            {
                while ((line = raf.ReadLine()) != null)
                {
                    StringTokenizer tok = new StringTokenizer(line);
                    if (!tok.HasMoreTokens())
                    {
                        continue;
                    }
                    String ident = tok.NextToken();
                    if (ident.Equals("KPX"))
                    {
                        String first     = tok.NextToken();
                        String second    = tok.NextToken();
                        int?   width     = (int)float.Parse(tok.NextToken(), System.Globalization.CultureInfo.InvariantCulture);
                        int    firstUni  = AdobeGlyphList.NameToUnicode(first);
                        int    secondUni = AdobeGlyphList.NameToUnicode(second);
                        if (firstUni != -1 && secondUni != -1)
                        {
                            long record = ((long)firstUni << 32) + secondUni;
                            kernPairs.Put(record, width);
                        }
                    }
                    else
                    {
                        if (ident.Equals("EndKernPairs"))
                        {
                            startKernPairs = false;
                            break;
                        }
                    }
                }
            }
            else
            {
                if (!endOfMetrics)
                {
                    String metricsPath = fontParser.GetAfmPath();
                    if (metricsPath != null)
                    {
                        throw new iText.IO.IOException("endfontmetrics is missing in {0}.").SetMessageParams(metricsPath);
                    }
                    else
                    {
                        throw new iText.IO.IOException("endfontmetrics is missing in the metrics file.");
                    }
                }
            }
            if (startKernPairs)
            {
                String metricsPath = fontParser.GetAfmPath();
                if (metricsPath != null)
                {
                    throw new iText.IO.IOException("endkernpairs is missing in {0}.").SetMessageParams(metricsPath);
                }
                else
                {
                    throw new iText.IO.IOException("endkernpairs is missing in the metrics file.");
                }
            }
            raf.Close();
            isFontSpecific = !(encodingScheme.Equals("AdobeStandardEncoding") || encodingScheme.Equals("StandardEncoding"
                                                                                                       ));
        }