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

pse*_*ode 2 c# pdf itext

我正在努力将 PDF 转换为文本。我可以正确地从 PDF 中获取文本,但它的表结构很复杂。我知道 PDF 不支持表格结构,但我认为有一种方法可以正确获取单元格。嗯,例如:

我想转换成这样的文本:

> This is first example.

> This is second example.
Run Code Online (Sandbox Code Playgroud)

但是,当我将 PDF 转换为文本时,这些数据如下所示:

> This is This is

> first example. second example.
Run Code Online (Sandbox Code Playgroud)

如何才能正确获取值?

- 编辑:

以下是我如何将 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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

mkl*_*mkl 5

为了使我的评论成为实际答案......

您使用LocationTextExtractionStrategy用于文本提取:

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

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

根据相关文档,可以采取不同的方法:

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

在这种情况下,OP评论说他改变LocationTextExtractionStrategySimpleTextExtractionStrategy,然后它就起作用了。