private static void AddToUnicodeCMapObject(PDF pdf, Font font) { for (int i = 0; i < pdf.fonts.Count; i++) { Font font2 = pdf.fonts[i]; if (font2.name.Equals(font.name) && font2.GetToUnicodeCMapObjNumber() != -1) { font.SetToUnicodeCMapObjNumber(font2.GetToUnicodeCMapObjNumber()); return; } } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("/CIDInit /ProcSet findresource begin\n"); stringBuilder.Append("12 dict begin\n"); stringBuilder.Append("begincmap\n"); stringBuilder.Append("/CIDSystemInfo <</Registry (Adobe) /Ordering (Identity) /Supplement 0>> def\n"); stringBuilder.Append("/CMapName /Adobe-Identity def\n"); stringBuilder.Append("/CMapType 2 def\n"); stringBuilder.Append("1 begincodespacerange\n"); stringBuilder.Append("<0000> <FFFF>\n"); stringBuilder.Append("endcodespacerange\n"); List <string> list = new List <string>(); StringBuilder stringBuilder2 = new StringBuilder(); for (int j = 0; j <= 65535; j++) { int num = font.unicodeToGID[j]; if (num > 0) { stringBuilder2.Append('<'); stringBuilder2.Append(FastFont.ToHexString(num)); stringBuilder2.Append("> <"); stringBuilder2.Append(FastFont.ToHexString(j)); stringBuilder2.Append(">\n"); list.Add(stringBuilder2.ToString()); stringBuilder2.Length = 0; if (list.Count == 100) { FastFont.WriteListToBuffer(list, stringBuilder); } } } if (list.Count > 0) { FastFont.WriteListToBuffer(list, stringBuilder); } stringBuilder.Append("endcmap\n"); stringBuilder.Append("CMapName currentdict /CMap defineresource pop\n"); stringBuilder.Append("end\nend"); pdf.Newobj(); pdf.Append("<<\n"); pdf.Append("/Length "); pdf.Append(stringBuilder.Length); pdf.Append("\n"); pdf.Append(">>\n"); pdf.Append("stream\n"); pdf.Append(stringBuilder.ToString()); pdf.Append("\nendstream\n"); pdf.Endobj(); font.SetToUnicodeCMapObjNumber(pdf.objNumber); }