【问题标题】:PDF- Can text chunk contains 2 or more words?PDF-文本块可以包含 2 个或更多单词吗?
【发布时间】:2018-07-16 18:46:54
【问题描述】:

我正在使用 LocationTextExtractionStrategy 从 PDF 呈现文本。 文本在称为 RenderText 的函数中呈现。 所以我的问题是:一个块可以包含两个以上的单词吗? 例如我们有文本: 'MKL 是一个乐于助人的人' 它可以写成块(最重要的块是粗体): MK

L

是一个人

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>();


}

【问题讨论】:

  • 我试图从here 扩展算法以返回单词位置(X,Y,Width,Height)而不是所有行 - 我已经在返回行中添加了宽度和高度,但我想知道块...它们可以包含什么?
  • 感谢您的赞美;)。正如@dirkt 回答的那样,你不能依赖任何东西。一个块可以包含从单个字母到整行(甚至跨多列)的任何内容。甚至可以少于可见字符,例如一个“a”可能由两个块“a”和“^”构建而成。但是,您的示例中的一件事不太可能发生:如果“人”一词作为单个块出现,则该块不太可能包含空格“人”。
  • 好的,所以我必须明智地解析它,并希望我的方法适用于大多数 pdf。我现在不太关心国家标志,我的意思是从 pdf 中删除敏感数据,例如:文件编号、价格、姓名和姓氏。当然有些名字可以包含特殊符号,但我认为不是这个时候解决这样的问题。感谢您的回复。

标签: pdf itext chunks


【解决方案1】:

不确定 LocationTextExtractionStrategy 来自哪个库,或者它究竟是做什么的,但在 PDF 表示本身中,您可以将字符组合在一个“块”中。

如何使用它完全取决于生成 PDF 的程序:有些程序将单词放在一起,有些程序只对单词片段进行分组(例如用于字距调整),有些程序执行其他随机操作。

所以,if LocationTextExtractionStrategy 将这些作为块返回,你不能依赖任何东西。 如果 LocationTextExtractionStrategy 不返回这些,而是​​依靠间距启发式将字符分组为块,那么这将与启发式一样好。

底线:PDF 不包含文本,并且包含字形及其在页面上的位置。试图从中重建文本是并且仍然是猜测。在大多数情况下,你可以让它工作,但总会有你所做的任何事情都失败的 PDF。

【讨论】:

  • 感谢您的回复。 LocationText~类来自iTextSharp.text.pdf.parser。
  • 您确定您的最后一句“A PDF 不包含文本,并且包含字形及其在页面上的位置”吗?我可以在文档的某处阅读它吗?
  • 是的。 PDF 包含嵌入在对象树中的受限形式的 Postscript。您可以将字形与字符相关联(并重构文本),如果 PDF 包含相应的表格,但是您仍然不知道单词从哪里开始和结束。标准是例如here。您可以使用mupdf 中的mutool 等工具对流进行解压缩,然后您可以在文本编辑器中打开PDF 文件并亲自查看。
猜你喜欢
  • 2021-10-16
  • 2018-06-08
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多