iTextSharp如何阅读PDF文件中的表格

时间:2016-12-02 10:13:15

标签: c# pdf itext

我正致力于将PDF转换为文本。我可以正确地从PDF获取文本,但是表结构很复杂。我知道PDF不支持表结构,但我认为有一种方法可以正确获取单元格。好吧,例如:

我想转换为这样的文字:

> This is first example.

> This is second example.

但是,当我将PDF转换为文本时,theese数据看起来像这样:

> This is This is

> first example. second example.

如何正确获取值?

- 编辑:

以下是我如何将PDF转换为文本:

OpenFileDialog ofd = new OpenFileDialog();
        string filepath;
        ofd.Filter = "PDF Files(*.PDF)|*.PDF|All Files(*.*)|*.*";

        if (ofd.ShowDialog() == DialogResult.OK)
        {
            filepath = ofd.FileName.ToString();

            string strText = string.Empty;
            try
            {
                PdfReader reader = new PdfReader(filepath);

                for (int page = 1; page < reader.NumberOfPages; page++)
                {
                    ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
                    string s = PdfTextExtractor.GetTextFromPage(reader, page, its);

                    s = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(s)));
                    strText += s;
                }
                reader.Close();
             }
             catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

1 个答案:

答案 0 :(得分:1)

让我的评论成为真正的答案......

您使用LocationTextExtractionStrategy进行文字提取:

ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
string s = PdfTextExtractor.GetTextFromPage(reader, page, its);

此策略从上到下排列从左到右的行找到的所有文本(实际上也考虑了文本行角度)。因此,显然不需要从具有多行内容的单元格的表中提取文本。

根据所涉及的文件,可以采取不同的方法:

  • 如果相关文档中的文字绘制操作已经按照文本提取的顺序进行,请使用iText SimpleTextExtractionStrategy
  • 使用自定义文本提取策略,如果文档表已正确标记,则使用标记信息。
  • 使用复杂的自定义文本提取策略,该策略尝试从文本排列,线路径或背景颜色中获取提示,以猜测表格单元格结构并逐个单元格提取文本。

在这种情况下,OP评论说他LocationTextExtractionStrategy更改了SimpleTextExtractionStrategy,然后就可以了。