internal void RegisterAsComposite( PDF pdf, Font font, Stream inputStream, bool embed) { otf = new OTF(inputStream); if (embed) { EmbedFontFile(pdf, font, otf, false); } AddFontDescriptorObject(pdf, font, otf, embed); AddCIDFontDictionaryObject(pdf, font, otf); AddToUnicodeCMapObject(pdf, font, otf); // Type0 Font Dictionary pdf.Newobj(); pdf.Append("<<\n"); pdf.Append("/Type /Font\n"); pdf.Append("/Subtype /Type0\n"); pdf.Append("/BaseFont /"); pdf.Append(otf.fontName); pdf.Append('\n'); pdf.Append("/Encoding /Identity-H\n"); pdf.Append("/DescendantFonts ["); pdf.Append(font.GetCidFontDictObjNumber()); pdf.Append(" 0 R]\n"); pdf.Append("/ToUnicode "); pdf.Append(font.GetToUnicodeCMapObjNumber()); pdf.Append(" 0 R\n"); pdf.Append(">>\n"); pdf.Endobj(); font.objNumber = pdf.objNumber; }
private static void AddToUnicodeCMapObject(PDF pdf, Font font) { for (int i = 0; i < pdf.fonts.Count; i++) { Font f = pdf.fonts[i]; if (f.name.Equals(font.name) && f.GetToUnicodeCMapObjNumber() != -1) { font.SetToUnicodeCMapObjNumber(f.GetToUnicodeCMapObjNumber()); return; } } StringBuilder sb = new StringBuilder(); sb.Append("/CIDInit /ProcSet findresource begin\n"); sb.Append("12 dict begin\n"); sb.Append("begincmap\n"); sb.Append("/CIDSystemInfo <</Registry (Adobe) /Ordering (Identity) /Supplement 0>> def\n"); sb.Append("/CMapName /Adobe-Identity def\n"); sb.Append("/CMapType 2 def\n"); sb.Append("1 begincodespacerange\n"); sb.Append("<0000> <FFFF>\n"); sb.Append("endcodespacerange\n"); List <String> list = new List <String>(); StringBuilder buf = new StringBuilder(); for (int cid = 0; cid <= 0xffff; cid++) { int gid = font.unicodeToGID[cid]; if (gid > 0) { buf.Append('<'); buf.Append(ToHexString(gid)); buf.Append("> <"); buf.Append(ToHexString(cid)); buf.Append(">\n"); list.Add(buf.ToString()); buf.Length = 0; if (list.Count == 100) { WriteListToBuffer(list, sb); } } } if (list.Count > 0) { WriteListToBuffer(list, sb); } sb.Append("endcmap\n"); sb.Append("CMapName currentdict /CMap defineresource pop\n"); sb.Append("end\nend"); pdf.Newobj(); pdf.Append("<<\n"); pdf.Append("/Length "); pdf.Append(sb.Length); pdf.Append("\n"); pdf.Append(">>\n"); pdf.Append("stream\n"); pdf.Append(sb.ToString()); pdf.Append("\nendstream\n"); pdf.Endobj(); font.SetToUnicodeCMapObjNumber(pdf.objNumber); }
internal static void Register( PDF pdf, Font font, Stream inputStream) { int len = inputStream.ReadByte(); byte[] fontName = new byte[len]; inputStream.Read(fontName, 0, len); font.name = System.Text.Encoding.UTF8.GetString(fontName, 0, len); // Console.WriteLine(font.name); len = GetInt24(inputStream); byte[] fontInfo = new byte[len]; inputStream.Read(fontInfo, 0, len); font.info = System.Text.Encoding.UTF8.GetString(fontInfo, 0, len); // Console.WriteLine(font.info); byte[] buf = new byte[GetInt32(inputStream)]; inputStream.Read(buf, 0, buf.Length); Decompressor decompressor = new Decompressor(buf); MemoryStream stream = new MemoryStream(decompressor.GetDecompressedData()); font.unitsPerEm = GetInt32(stream); font.bBoxLLx = GetInt32(stream); font.bBoxLLy = GetInt32(stream); font.bBoxURx = GetInt32(stream); font.bBoxURy = GetInt32(stream); font.ascent = GetInt32(stream); font.descent = GetInt32(stream); font.firstChar = GetInt32(stream); font.lastChar = GetInt32(stream); font.capHeight = GetInt32(stream); font.underlinePosition = GetInt32(stream); font.underlineThickness = GetInt32(stream); len = GetInt32(stream); font.advanceWidth = new int[len]; for (int i = 0; i < len; i++) { font.advanceWidth[i] = GetInt16(stream); } len = GetInt32(stream); font.glyphWidth = new int[len]; for (int i = 0; i < len; i++) { font.glyphWidth[i] = GetInt16(stream); } len = GetInt32(stream); font.unicodeToGID = new int[len]; for (int i = 0; i < len; i++) { font.unicodeToGID[i] = GetInt16(stream); } font.cff = (inputStream.ReadByte() == 'Y') ? true : false; font.uncompressed_size = GetInt32(inputStream); font.compressed_size = GetInt32(inputStream); EmbedFontFile(pdf, font, inputStream); AddFontDescriptorObject(pdf, font); AddCIDFontDictionaryObject(pdf, font); AddToUnicodeCMapObject(pdf, font); // Type0 Font Dictionary pdf.Newobj(); pdf.Append("<<\n"); pdf.Append("/Type /Font\n"); pdf.Append("/Subtype /Type0\n"); pdf.Append("/BaseFont /"); pdf.Append(font.name); pdf.Append('\n'); pdf.Append("/Encoding /Identity-H\n"); pdf.Append("/DescendantFonts ["); pdf.Append(font.GetCidFontDictObjNumber()); pdf.Append(" 0 R]\n"); pdf.Append("/ToUnicode "); pdf.Append(font.GetToUnicodeCMapObjNumber()); pdf.Append(" 0 R\n"); pdf.Append(">>\n"); pdf.Endobj(); font.objNumber = pdf.objNumber; }
internal static void Register( SortedDictionary <Int32, PDFobj> objects, Font font, Stream inputStream) { int len = inputStream.ReadByte(); byte[] fontName = new byte[len]; inputStream.Read(fontName, 0, len); font.name = System.Text.Encoding.UTF8.GetString(fontName, 0, len); // Console.WriteLine(font.name); len = GetInt24(inputStream); byte[] fontInfo = new byte[len]; inputStream.Read(fontInfo, 0, len); font.info = System.Text.Encoding.UTF8.GetString(fontInfo, 0, len); // Console.WriteLine(font.info); byte[] buf = new byte[GetInt32(inputStream)]; inputStream.Read(buf, 0, buf.Length); Decompressor decompressor = new Decompressor(buf); MemoryStream stream = new MemoryStream(decompressor.GetDecompressedData()); font.unitsPerEm = GetInt32(stream); font.bBoxLLx = GetInt32(stream); font.bBoxLLy = GetInt32(stream); font.bBoxURx = GetInt32(stream); font.bBoxURy = GetInt32(stream); font.ascent = GetInt32(stream); font.descent = GetInt32(stream); font.firstChar = GetInt32(stream); font.lastChar = GetInt32(stream); font.capHeight = GetInt32(stream); font.underlinePosition = GetInt32(stream); font.underlineThickness = GetInt32(stream); len = GetInt32(stream); font.advanceWidth = new int[len]; for (int i = 0; i < len; i++) { font.advanceWidth[i] = GetInt16(stream); } len = GetInt32(stream); font.glyphWidth = new int[len]; for (int i = 0; i < len; i++) { font.glyphWidth[i] = GetInt16(stream); } len = GetInt32(stream); font.unicodeToGID = new int[len]; for (int i = 0; i < len; i++) { font.unicodeToGID[i] = GetInt16(stream); } font.cff = (inputStream.ReadByte() == 'Y') ? true : false; font.uncompressed_size = GetInt32(inputStream); font.compressed_size = GetInt32(inputStream); EmbedFontFile(objects, font, inputStream); AddFontDescriptorObject(objects, font); AddCIDFontDictionaryObject(objects, font); AddToUnicodeCMapObject(objects, font); // Type0 Font Dictionary PDFobj obj = new PDFobj(); List <String> dict = obj.GetDict(); dict.Add("<<"); dict.Add("/Type"); dict.Add("/Font"); dict.Add("/Subtype"); dict.Add("/Type0"); dict.Add("/BaseFont"); dict.Add("/" + font.name); dict.Add("/Encoding"); dict.Add("/Identity-H"); dict.Add("/DescendantFonts"); dict.Add("["); dict.Add(font.GetCidFontDictObjNumber().ToString()); dict.Add("0"); dict.Add("R"); dict.Add("]"); dict.Add("/ToUnicode"); dict.Add(font.GetToUnicodeCMapObjNumber().ToString()); dict.Add("0"); dict.Add("R"); dict.Add(">>"); obj.number = MaxKey(objects.Keys) + 1; objects.Add(obj.number, obj); font.objNumber = obj.number; }
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); }
internal static void Register( PDF pdf, Font font, Stream inputStream) { int len = inputStream.ReadByte(); byte[] fontName = new byte[len]; inputStream.Read(fontName, 0, len); font.name = System.Text.Encoding.UTF8.GetString(fontName); // Console.WriteLine(font.name); font.unitsPerEm = GetInt32(inputStream); font.bBoxLLx = GetInt32(inputStream); font.bBoxLLy = GetInt32(inputStream); font.bBoxURx = GetInt32(inputStream); font.bBoxURy = GetInt32(inputStream); font.ascent = GetInt32(inputStream); font.descent = GetInt32(inputStream); font.firstChar = GetInt32(inputStream); font.lastChar = GetInt32(inputStream); font.capHeight = GetInt32(inputStream); font.underlinePosition = GetInt32(inputStream); font.underlineThickness = GetInt32(inputStream); len = GetInt32(inputStream); font.advanceWidth = new int[len]; for (int i = 0; i < len; i++) { font.advanceWidth[i] = GetInt16(inputStream); } len = GetInt32(inputStream); font.glyphWidth = new int[len]; for (int i = 0; i < len; i++) { font.glyphWidth[i] = GetInt16(inputStream); } len = GetInt32(inputStream); font.unicodeToGID = new int[len]; for (int i = 0; i < len; i++) { font.unicodeToGID[i] = GetInt16(inputStream); } font.uncompressed_size = GetInt32(inputStream); font.compressed_size = GetInt32(inputStream); EmbedFontFile(pdf, font, inputStream); AddFontDescriptorObject(pdf, font); AddCIDFontDictionaryObject(pdf, font); AddToUnicodeCMapObject(pdf, font); // Type0 Font Dictionary pdf.Newobj(); pdf.Append("<<\n"); pdf.Append("/Type /Font\n"); pdf.Append("/Subtype /Type0\n"); pdf.Append("/BaseFont /"); pdf.Append(font.name); pdf.Append('\n'); pdf.Append("/Encoding /Identity-H\n"); pdf.Append("/DescendantFonts ["); pdf.Append(font.GetCidFontDictObjNumber()); pdf.Append(" 0 R]\n"); pdf.Append("/ToUnicode "); pdf.Append(font.GetToUnicodeCMapObjNumber()); pdf.Append(" 0 R\n"); pdf.Append(">>\n"); pdf.Endobj(); font.objNumber = pdf.objNumber; }