/** * Decodes a string of bytes (encoded in the font's encoding) into a unicode string * This will use the ToUnicode map of the font, if available, otherwise it uses * the font's encoding * @param cidbytes the bytes that need to be decoded * @return the unicode String that results from decoding * @since 2.1.7 */ virtual public String Decode(byte[] cidbytes, int offset, int len) { StringBuilder sb = new StringBuilder(); if (toUnicodeCmap == null && byteCid != null) { CMapSequence seq = new CMapSequence(cidbytes, offset, len); String cid = byteCid.DecodeSequence(seq); foreach (char ca in cid) { int c = cidUni.Lookup(ca); if (c > 0) { sb.Append(Utilities.ConvertFromUtf32(c)); } } } else { for (int i = offset; i < offset + len; i++) { String rslt = DecodeSingleCID(cidbytes, i, 1); if (rslt == null && i < offset + len - 1) { rslt = DecodeSingleCID(cidbytes, i, 2); i++; } if (rslt != null) { sb.Append(rslt); } } } return(sb.ToString()); }
public override int GetUnicodeEquivalent(int c) { if (cidDirect) { if (c == CID_NEWLINE) { return('\n'); } return(cidUni.Lookup(c)); } return(c); }
private void InitializeCidFontProperties(IDictionary <String, Object> fontDesc) { fontIdentification.SetPanose((String)fontDesc.Get("Panose")); fontMetrics.SetItalicAngle(Convert.ToInt32((String)fontDesc.Get("ItalicAngle"), System.Globalization.CultureInfo.InvariantCulture )); fontMetrics.SetCapHeight(Convert.ToInt32((String)fontDesc.Get("CapHeight"), System.Globalization.CultureInfo.InvariantCulture )); fontMetrics.SetTypoAscender(Convert.ToInt32((String)fontDesc.Get("Ascent"), System.Globalization.CultureInfo.InvariantCulture )); fontMetrics.SetTypoDescender(Convert.ToInt32((String)fontDesc.Get("Descent"), System.Globalization.CultureInfo.InvariantCulture )); fontMetrics.SetStemV(Convert.ToInt32((String)fontDesc.Get("StemV"), System.Globalization.CultureInfo.InvariantCulture )); pdfFontFlags = Convert.ToInt32((String)fontDesc.Get("Flags"), System.Globalization.CultureInfo.InvariantCulture ); String fontBBox = (String)fontDesc.Get("FontBBox"); StringTokenizer tk = new StringTokenizer(fontBBox, " []\r\n\t\f"); int llx = Convert.ToInt32(tk.NextToken(), System.Globalization.CultureInfo.InvariantCulture); int lly = Convert.ToInt32(tk.NextToken(), System.Globalization.CultureInfo.InvariantCulture); int urx = Convert.ToInt32(tk.NextToken(), System.Globalization.CultureInfo.InvariantCulture); int ury = Convert.ToInt32(tk.NextToken(), System.Globalization.CultureInfo.InvariantCulture); fontMetrics.UpdateBbox(llx, lly, urx, ury); registry = (String)fontDesc.Get("Registry"); String uniMap = GetCompatibleUniMap(registry); if (uniMap != null) { IntHashtable metrics = (IntHashtable)fontDesc.Get("W"); CMapCidUni cid2Uni = FontCache.GetCid2UniCmap(uniMap); avgWidth = 0; foreach (int cid in cid2Uni.GetCids()) { int uni = cid2Uni.Lookup(cid); int width = metrics.ContainsKey(cid) ? metrics.Get(cid) : DEFAULT_WIDTH; Glyph glyph = new Glyph(cid, width, uni); avgWidth += glyph.GetWidth(); codeToGlyph.Put(cid, glyph); unicodeToGlyph.Put(uni, glyph); } FixSpaceIssue(); if (codeToGlyph.Count != 0) { avgWidth /= codeToGlyph.Count; } } }