gpt4 book ai didi

c# - 使用 iText 从 pdf 中提取字体名称、大小、样式

转载 作者:行者123 更新时间:2023-12-04 07:27:47 38 4
gpt4 key购买 nike

我正在尝试使用 iText 7.1.14 从各种 pdf 文件中提取文本,具体取决于字体、字体大小和字体样式。

public class FontSizeSimpleTextExtractionStrategy : SimpleTextExtractionStrategy
{
FieldInfo _textField = typeof(TextRenderInfo).GetField("text", BindingFlags.NonPublic | BindingFlags.Instance);
public override void EventOccurred(IEventData data, EventType type)
{
if (type.Equals(EventType.RENDER_TEXT))
{
TextRenderInfo renderInfo = (TextRenderInfo)data;
string fontName = renderInfo.GetFont()?.GetFontProgram()?.GetFontNames()?.GetFontName();
iText.Kernel.Colors.Color color = renderInfo.GetFillColor();
float size = renderInfo.GetFontSize();

if (fontName != null)
{
_textField.SetValue(renderInfo, "#Data|" + fontName + "|" + size.ToString() + "|" + ColorToString(color) + "|Data#" + renderInfo.GetText());
}

}
base.EventOccurred(data, type);
}
}
在某些文件中,“size”的值始终为“1”,尽管 Adob​​e Acrobat 显示正确的字体大小,即 this example file 中的 25 和 11 .
是否有机会使用 iText 获得正确的大小?

最佳答案

这个问题的原因是忽略了当前变换矩阵和文本矩阵对绘制文本的变换。
TextRenderInfo 返回的字体大小是绘制文本时当前图形状态的字体大小值。该值还不包括当前文本和变换矩阵对绘制文本的变换。
因此,人们必须通过这些矩阵转换一个直立向量,只要字体大小值,并从结果中确定有效大小。TextRenderInfo.GetTextMatrix() value 实际上包含了文本矩阵和当前变换矩阵的乘积,所以我们只需要使用那个值。

class FontSizeSimpleTextExtractionStrategyImproved : SimpleTextExtractionStrategy
{
FieldInfo _textField = typeof(TextRenderInfo).GetField("text", BindingFlags.NonPublic | BindingFlags.Instance);
public override void EventOccurred(IEventData data, EventType type)
{
if (type.Equals(EventType.RENDER_TEXT))
{
TextRenderInfo renderInfo = (TextRenderInfo)data;
string fontName = renderInfo.GetFont()?.GetFontProgram()?.GetFontNames()?.GetFontName();
Color color = renderInfo.GetFillColor();

float size = renderInfo.GetFontSize();
Vector sizeHighVector = new Vector(0, size, 0);
Matrix matrix = renderInfo.GetTextMatrix();
float sizeAdjusted = sizeHighVector.Cross(matrix).Length();

if (fontName != null)
{
_textField.SetValue(renderInfo, "#Data|" + fontName + "|" + sizeAdjusted.ToString() + "|" + ColorToString(color) + "|Data#" + renderInfo.GetText());
}
}
base.EventOccurred(data, type);
}
}
( ExtractWithFontSize 助手类)

关于c# - 使用 iText 从 pdf 中提取字体名称、大小、样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68133934/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com