我使用LocationTextExtractionStrategy从PDF呈现文本。 文本在称为RenderText的函数中呈现。 所以我的问题是:一个块可以包含两个以上的单词吗? 例如,我们有文本: “ MKL是一个乐于助人的人” 是否可以像这样编写块(最重要的块为粗体): MK
L
是h
elpfull
每个儿子
?
以下是我用于单词分离的代码。 我在将文本(来自renderText函数的块)添加到当前行期间进行了单词分离。
public class TextLineLocation
{
public float X { get; set; }
public float Y { get; set; }
public float Height { get; set; }
public float Width { get; set; }
private string Text;
private List<char> bannedSings = new List<char>() {' ',',', '.', '/', '|', Convert.ToChar(@"\"), ';', '(', ')', '*', '&', '^', '!','?' };
public void AddText(TextInfo text)
{
Text += text;
foreach (char sign in bannedSings)
{
//creating new word
if (text.textChunk.Text.Contains(sign))
{
string[] splittedText = text.textChunk.Text.Split(sign);
foreach (string val in splittedText)
{
//if its first element, add it to current word
if (splittedText[0] == val)
{
// if its space, just ignore...
if (splittedText[0] == " ")
{
continue;
}
wordList[wordList.Count - 1].Text += val;
wordList[wordList.Count - 1].Width += text.getFontWidth();
wordList[wordList.Count - 1].Height += text.getFontHeight();
}
else
{
//if it isnt a first element, create another word
wordList.Add(new WordLocation(text.textChunk.StartLocation[1], text.textChunk.StartLocation[0], text.getFontWidth(), text.getFontHeight(), val));
//TODO: what if chunk has more than 2 words separated ?
}
}
}
}
else
{
//update last word
wordList[wordList.Count-1].Text += text.textChunk.Text;
wordList[wordList.Count - 1].Width += text.getFontWidth();
wordList[wordList.Count - 1].Height += text.getFontHeight();
}
}
public List<WordLocation> wordList = new List<WordLocation>();
}
答案 0 :(得分:0)
不确定LocationTextExtractionStrategy来自哪个库,或者它到底是做什么的,但是在PDF表示本身中,您可以将字符分组为“块”。
如何完全使用它取决于生成PDF的程序:某些程序将单词组合在一起,某些程序仅将单词片段分组(例如,字距调整),某些程序执行其他随机操作。
因此,如果 LocationTextExtractionStrategy将它们作为块返回,则您不能依赖任何东西。 如果 LocationTextExtractionStrategy不返回这些字符,而是依靠空格启发式将字符分组为大块,那么这将与启发式一样好。
底线:PDF不包含文本,而是包含字形及其在页面上的位置。尝试从中重建文本仍然是猜测。您可能会在大多数情况下使它工作,但总会有PDF导致您的操作失败。