Pdf 如何从TextRenderInfo获取字体高度/重量?
当我使用iTextSharp解析一个现有的PDF时,我创建了一个实现IRenderListener的对象,我将它传递到PdfReaderContentParser.ProcessContent,果然,我的对象的RenderText会被PDF中的所有文本反复调用 问题是,TextRenderInfo告诉我在我的例子Helvetica中的基本字体,但我不能告诉字体的高度,也不能告诉它的常规字体和粗体字体的重量。这是已知的iTextSharp缺陷还是我遗漏了什么 TextRenderInfo告诉我在我的例子Helvetica中的基本字体,但我不能告诉字体的高度,也不能告诉常规字体和粗体字体的重量 身高 不幸的是,iTextSharp没有在TextRenderInfo中提供公共字体大小方法或成员。一些人通过使用GetAscentLine和GetDescentLine之间的距离来解决这个问题 但是,如果您已经准备好使用反射,则可以通过公开和使用私有TextRenderInfo成员GraphicsState gs来做得更好,例如,在这个渲染侦听器中:Pdf 如何从TextRenderInfo获取字体高度/重量?,pdf,fonts,itext,Pdf,Fonts,Itext,当我使用iTextSharp解析一个现有的PDF时,我创建了一个实现IRenderListener的对象,我将它传递到PdfReaderContentParser.ProcessContent,果然,我的对象的RenderText会被PDF中的所有文本反复调用 问题是,TextRenderInfo告诉我在我的例子Helvetica中的基本字体,但我不能告诉字体的高度,也不能告诉它的常规字体和粗体字体的重量。这是已知的iTextSharp缺陷还是我遗漏了什么 TextRenderInfo告诉我在我
public class LocationTextSizeExtractionStrategy : LocationTextExtractionStrategy
{
//Hold each coordinate
public List<SizeAndTextAndFont> myChunks = new List<SizeAndTextAndFont>();
//Automatically called for each chunk of text in the PDF
public override void RenderText(TextRenderInfo wholeRenderInfo)
{
base.RenderText(wholeRenderInfo);
GraphicsState gs = (GraphicsState) GsField.GetValue(wholeRenderInfo);
myChunks.Add(new SizeAndTextAndFont(gs.FontSize, wholeRenderInfo.GetText(), wholeRenderInfo.GetFont().PostscriptFontName));
}
FieldInfo GsField = typeof(TextRenderInfo).GetField("gs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
}
//Helper class that stores our rectangle, text, and font
public class SizeAndTextAndFont
{
public float Size;
public String Text;
public String Font;
public SizeAndTextAndFont(float size, String text, String font)
{
this.Size = size;
this.Text = text;
this.Font = font;
}
}
使用此附加反射FieldInfo成员
重量
正如您在上面的输出中所看到的,字体名称可能不仅仅包含字体系列名称,还包含一个权重指示器
< March 23 , 2015> in Helvetica-Bold at 8
因此,在你的例子中
TextRenderInfo告诉我关于我的示例Helvetica中的基本字体
没有任何装饰的Helvetica将意味着正常的重量
Helvetica是每个PDF查看器必须提供的标准14种字体之一:Times Roman、Helvetica、Courier、Symbol、Times Bold、Helvetica Bold、Courier Bold、ZapfDingbats、Times Italic、Helvetica斜面、Courier斜面、Times BoldItalic、Helvetica BoldItalic、Courier BoldItalic。因此,这些名字相当可靠
不幸的是,字体名称通常可以任意选择;粗体字体的名称中可能有粗体、黑色或其他粗体标志,或者根本没有
还可以尝试使用字体的FontDescriptor字典,其中指定了条目FontWeight。不幸的是,这个条目是可选的,您根本不能指望它在那里
此外,PDF中的字体可以人为加粗,参见:
所有这些数字都使用相同的字体绘制,只是增加了一个上升的轮廓线宽度
因此,我恐怕没有可靠的方法来找到确切的字体大小,仅仅是一些试探法,可能返回也可能不返回可接受的近似值
TextRenderInfo告诉我在我的例子Helvetica中的基本字体,但我不能告诉字体的高度,也不能告诉常规字体和粗体字体的重量
身高
不幸的是,iTextSharp没有在TextRenderInfo中提供公共字体大小方法或成员。一些人通过使用GetAscentLine和GetDescentLine之间的距离来解决这个问题
但是,如果您已经准备好使用反射,则可以通过公开和使用私有TextRenderInfo成员GraphicsState gs来做得更好,例如,在这个渲染侦听器中:
public class LocationTextSizeExtractionStrategy : LocationTextExtractionStrategy
{
//Hold each coordinate
public List<SizeAndTextAndFont> myChunks = new List<SizeAndTextAndFont>();
//Automatically called for each chunk of text in the PDF
public override void RenderText(TextRenderInfo wholeRenderInfo)
{
base.RenderText(wholeRenderInfo);
GraphicsState gs = (GraphicsState) GsField.GetValue(wholeRenderInfo);
myChunks.Add(new SizeAndTextAndFont(gs.FontSize, wholeRenderInfo.GetText(), wholeRenderInfo.GetFont().PostscriptFontName));
}
FieldInfo GsField = typeof(TextRenderInfo).GetField("gs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
}
//Helper class that stores our rectangle, text, and font
public class SizeAndTextAndFont
{
public float Size;
public String Text;
public String Font;
public SizeAndTextAndFont(float size, String text, String font)
{
this.Size = size;
this.Text = text;
this.Font = font;
}
}
使用此附加反射FieldInfo成员
重量
正如您在上面的输出中所看到的,字体名称可能不仅仅包含字体系列名称,还包含一个权重指示器
< March 23 , 2015> in Helvetica-Bold at 8
因此,在你的例子中
TextRenderInfo告诉我关于我的示例Helvetica中的基本字体
没有任何装饰的Helvetica将意味着正常的重量
Helvetica是每个PDF查看器必须提供的标准14种字体之一:Times Roman、Helvetica、Courier、Symbol、Times Bold、Helvetica Bold、Courier Bold、ZapfDingbats、Times Italic、Helvetica斜面、Courier斜面、Times BoldItalic、Helvetica BoldItalic、Courier BoldItalic。因此,这些名字相当可靠
不幸的是,字体名称通常可以任意选择;粗体字体的名称中可能有粗体、黑色或其他粗体标志,或者根本没有
还可以尝试使用字体的FontDescriptor字典,其中指定了条目FontWeight。不幸的是,这个条目是可选的,您根本不能指望它在那里
此外,PDF中的字体可以人为加粗,参见:
所有这些数字都使用相同的字体绘制,只是增加了一个上升的轮廓线宽度
因此,恐怕没有可靠的方法来确定确切的字体大小,而仅仅是一些试探法,它们可能返回或可能不返回可接受的近似值。Thx。你节省了我的时间。你节省了我的时间。
FieldInfo TextToUserSpaceTransformMatrixField = typeof(TextRenderInfo).GetField("textToUserSpaceTransformMatrix", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
< March 23 , 2015> in Helvetica-Bold at 8