【发布时间】:2018-09-08 21:24:34
【问题描述】:
使用 iTextSharp,我如何确定已解析的文本块是否同时加粗和加下划线?
详情:
我正在尝试在 C# 中解析 .PDF 文件,专门针对粗体和下划线的文本。使用 ITextSharp,我可以从 LocationTextExtractionStrategy 派生并从传递给重写的 .RenderText 方法的 iTextSharp.text.pdf.parser.TextRenderInfo 对象中获取文本、位置、字体等。
但是,从 TextRenderInfo 对象确定文本是否为粗体和/下划线并不容易。
- 我尝试使用 TextRenderInfo.GetFont() 查找字体属性,但未成功
- 我目前可以确定文本是否为粗体,方法是访问 TextRenderInfo 对象上的私有图形状态字段并检查它的 .Font.PostscriptFontName 属性中是否有“粗体”一词(丑陋,但似乎可以工作。)
- 最大的问题:我没有找到任何东西来确定文本是否带下划线。我该如何确定?
这是我目前的尝试:
private FieldInfo _gsField = typeof(TextRenderInfo).GetField("gs",
BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
//Automatically called for each chunk of text in the PDF
public override void RenderText(TextRenderInfo renderInfo)
{
base.RenderText(renderInfo);
//UNDONE:Need to determine if text is underlined. How?
//NOTE: renderInfo.GetFont().FontWeight does not contain any actual information
var gs = (GraphicsState)_gsField.GetValue(renderInfo);
var textChunkInfo = new TextChunkInfo(renderInfo);
_allLocations.Add(textChunkInfo);
if (gs.Font.PostscriptFontName.Contains("Bold"))
//Add this to our found collection
FoundItems.Add(new TextChunkInfo(renderInfo));
if (!_lineHeights.Contains(textChunkInfo.LineHeight))
_lineHeights.Add(textChunkInfo.LineHeight);
}
当前尝试的完整源代码:GitHub Repository(两个示例(example.pdf 和 example2.pdf)包含在类似于我将要搜索的文本中。)
【问题讨论】:
-
@Ryan 这并不是真正的重复,该问题和答案集中在一个特定的 pdf 上,该操作的大胆识别失败了。这个问题是关于更一般的情况。
-
@RyanSingh 另外,这是关于检测粗体文本,我已经可以做到(尽管该链接显示了更好的方法)。它不包括下划线文本,这是我没有答案的部分