public override bool AllowText(TextRenderInfo renderInfo) { DocumentFont font = renderInfo.GetFont(); PdfDictionary fontDict = font.FontDictionary; PdfName subType = fontDict.GetAsName(PdfName.SUBTYPE); if (PdfName.TYPE0.Equals(subType)) { PdfArray descendantFonts = fontDict.GetAsArray(PdfName.DESCENDANTFONTS); PdfDictionary descendantFont = descendantFonts[0] as PdfDictionary; PdfDictionary fontDescriptor = descendantFont.GetAsDict(PdfName.FONTDESCRIPTOR); PdfStream fontStream = fontDescriptor.GetAsStream(PdfName.FONTFILE2); byte[] fontData = PdfReader.GetStreamBytes((PRStream)fontStream); MemoryStream dataStream = new MemoryStream(fontData); dataStream.Position = 0; MemoryPackage memoryPackage = new MemoryPackage(); Uri uri = memoryPackage.CreatePart(dataStream); GlyphTypeface glyphTypeface = new GlyphTypeface(uri); ICollection <string> names = glyphTypeface.FamilyNames.Values; return(names.Where(name => name.Contains("Arial")).Count() > 0); } else { // analogous code for other font subtypes return(false); } }
/** * Gets the width of a String in text space units * @param string the string that needs measuring * @return the width of a String in text space units */ private float GetStringWidth(String str) { DocumentFont font = gs.font; char[] chars = str.ToCharArray(); float totalWidth = 0; for (int i = 0; i < chars.Length; i++) { float w = font.GetWidth(chars[i]) / 1000.0f; float wordSpacing = chars[i] == 32 ? gs.wordSpacing : 0f; totalWidth += (w * gs.fontSize + gs.characterSpacing + wordSpacing) * gs.horizontalScaling; } return(totalWidth); }
/** * Provides detail useful if a listener needs access to the position of each individual glyph in the text render operation * @return A list of {@link TextRenderInfo} objects that represent each glyph used in the draw operation. The next effect is if there was a separate Tj opertion for each character in the rendered string * @since 5.3.3 */ public List <TextRenderInfo> GetCharacterRenderInfos() { List <TextRenderInfo> rslt = new List <TextRenderInfo>(text.Length); DocumentFont font = gs.font; char[] chars = text.ToCharArray(); float totalWidth = 0; for (int i = 0; i < chars.Length; i++) { float w = font.GetWidth(chars[i]) / 1000.0f; float wordSpacing = chars[i] == 32 ? gs.wordSpacing : 0f; TextRenderInfo subInfo = new TextRenderInfo(this, i, totalWidth); rslt.Add(subInfo); totalWidth += (w * gs.fontSize + gs.characterSpacing + wordSpacing) * gs.horizontalScaling; } return(rslt); }
private float GetStringWidth(string str, float curFontSize, float pSingleSpaceWidth, DocumentFont pFont) { char[] chars = str.ToCharArray(); float totalWidth = 0; float w = 0; foreach (char c in chars) { w = pFont.GetWidth(c) / 1000f; totalWidth += (w * curFontSize + this.UndercontentCharacterSpacing) * this.UndercontentHorizontalScaling / 100; } return(totalWidth); }
public static DocumentFont GetFont(string name, bool IsBold, bool IsItalic, Embedded embedded) { string normalizedName = GetName(name, IsBold, IsItalic, embedded); // base fonts if (baseFontsNames.ContainsKey(SimplifyBaseName(normalizedName))) { var fontBaseName = baseFontsNames[SimplifyBaseName(normalizedName)]; lock (lck) { if (m_lstFont.ContainsKey(fontBaseName)) { return(m_lstFont[fontBaseName]); } var font = new DocumentBaseFont(fontBaseName); m_lstFont.Add(fontBaseName, font); return(font); } } // unknown, or disk or systemfonts DocumentFont ttffont = null; lock (lck) { if (m_lstFont.ContainsKey(normalizedName)) { return(m_lstFont[normalizedName]); } if (embedded == Embedded.No) { if (File.Exists(name)) { ttffont = new DocumentTtfFont(name); } else { LoadSystemFonts(); if (!dctFontRegistered.ContainsKey(name)) { throw new PdfException(PdfExceptionCodes.FONT_NOT_FOUND, "Font " + name + " not found"); } ttffont = new DocumentTtfFont(dctFontRegistered[name]); } } else { if (File.Exists(name)) { ttffont = new DocumentTtfSubsetFont(name); } else { LoadSystemFonts(); if (!dctFontRegistered.ContainsKey(name)) { throw new PdfException(PdfExceptionCodes.FONT_NOT_FOUND, "Font " + name + " not found"); } ttffont = new DocumentTtfSubsetFont(dctFontRegistered[name]); } } m_lstFont.Add(normalizedName, ttffont); } return(ttffont); }
private float GetStringWidth(string currentText, float curFontSize, float pSingleSpaceWidth, DocumentFont pFont) { char[] chArray = currentText.ToCharArray(); float left = 0f; float num3 = 0f; foreach (char theCharacter in chArray) { num3 = (float)(((double)pFont.GetWidth(Convert.ToString(theCharacter))) / 1000.0); left += Convert.ToSingle(num3 * curFontSize); } return(left); }
public override void RenderText(TextRenderInfo renderInfo) { DocumentFont font = renderInfo.GetFont(); byte[] bytes = font.ConvertToBytes(renderInfo.GetText()); StringBuilder partStr = new StringBuilder(); //PdfDictionary dict = font.FontDictionary; //PdfDictionary encoding = dict.GetAsDict(PdfName.ENCODING); //if (encoding != null) { string renderTxt = renderInfo.GetText(); foreach (char c in renderTxt) { string name = c.ToString(); if (CharMaps.ContainsKey(name)) { string chat = CharMaps[name]; partStr.Append(chat); } else { /* * String s = name.ToString().Substring(4); * byte[] nameBytes = this.HexStringToBytes(s); * string text = Encoding.BigEndianUnicode.GetString(nameBytes); * partStr.Append(text); */ partStr.Append(name); } } /* * PdfArray diffs = encoding.GetAsArray(PdfName.DIFFERENCES); * StringBuilder builder = new StringBuilder(); * foreach (byte b in renderInfo.PdfString.GetBytes()) * { * string name = ""; * try * { * name = diffs.GetAsName((char)b).ToString(); * } * catch (Exception ex) * { * //throw ex; * } * if (CharMaps.ContainsKey(name)) * { * string chat = CharMaps[name]; * //partStr.Append(chat); * } * else * { * //String s = name.ToString().Substring(4); * //byte[] nameBytes = this.HexStringToBytes(s); * //string text = Encoding.BigEndianUnicode.GetString(nameBytes); * //partStr.Append(text); * } * } */ } //else //{ // partStr.Append(renderInfo.GetText()); //} if (partStr.ToString().Trim().Length > 0) { LineSegment segment = renderInfo.GetAscentLine(); Vector startPoint = segment.GetStartPoint(); if (LastEndPoint != null) { int charCount = partStr.Length; float singleWidth = renderInfo.GetSingleSpaceWidth();// segment.GetEndPoint().Subtract(segment.GetStartPoint()).Length / (float)charCount; string[] pStartStrs = startPoint.ToString().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); string[] pLastEndStrs = LastEndPoint.ToString().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); float verticalSpan = Math.Abs(float.Parse(pStartStrs[1]) - float.Parse(pLastEndStrs[1])); if (verticalSpan > renderInfo.GetSingleSpaceWidth()) { if (verticalSpan > 4 * renderInfo.GetSingleSpaceWidth()) { TextBuilder.Append("\r\n\r\n"); } else { TextBuilder.Append("\r\n"); } } else { Vector spanVector = startPoint.Subtract(LastEndPoint); float span = spanVector.Length; if (span > singleWidth / 2f) { TextBuilder.Append(" "); } } } TextBuilder.Append(partStr.ToString()); LastEndPoint = segment.GetEndPoint(); } base.RenderText(renderInfo); }