Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pdf 如何从TextRenderInfo获取字体高度/重量?_Pdf_Fonts_Itext - Fatal编程技术网

Pdf 如何从TextRenderInfo获取字体高度/重量?

Pdf 如何从TextRenderInfo获取字体高度/重量?,pdf,fonts,itext,Pdf,Fonts,Itext,当我使用iTextSharp解析一个现有的PDF时,我创建了一个实现IRenderListener的对象,我将它传递到PdfReaderContentParser.ProcessContent,果然,我的对象的RenderText会被PDF中的所有文本反复调用 问题是,TextRenderInfo告诉我在我的例子Helvetica中的基本字体,但我不能告诉字体的高度,也不能告诉它的常规字体和粗体字体的重量。这是已知的iTextSharp缺陷还是我遗漏了什么 TextRenderInfo告诉我在我

当我使用iTextSharp解析一个现有的PDF时,我创建了一个实现IRenderListener的对象,我将它传递到PdfReaderContentParser.ProcessContent,果然,我的对象的RenderText会被PDF中的所有文本反复调用

问题是,TextRenderInfo告诉我在我的例子Helvetica中的基本字体,但我不能告诉字体的高度,也不能告诉它的常规字体和粗体字体的重量。这是已知的iTextSharp缺陷还是我遗漏了什么

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中的字体可以人为加粗,参见:

所有这些数字都使用相同的字体绘制,只是增加了一个上升的轮廓线宽度

因此,我恐怕没有可靠的方法来找到确切的字体大小,仅仅是一些试探法,可能返回也可能不返回可接受的近似值

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