【问题标题】:How to read table?如何读表?
【发布时间】:2026-01-14 08:50:01
【问题描述】:

我有一个 PDF 文件的时间表。

            (1)     (2)     (3)
            09:00   10:30   11:30            
Monday      12C     11B     10A
Tuesday     10K     10K     9A
Wednesday           7A
Thursday    7B      7B
Friday      6A              11B

我正在使用 iTextSharp 阅读所有文本。

    private static string ReadFile(string path)
    {
        using (var reader = new PdfReader(path))
        {
            var text = new StringBuilder();

            for (var i = 1; i <= reader.NumberOfPages; i++)
                text.Append(PdfTextExtractor.GetTextFromPage(reader, i));

            return text.ToString();
        }
    }

这个文本响应行是这样的:

(1) (2) (3) 
09:00 10:30 11:30
12C 11B 10A
Monday
10K 10K 9A
Tuesday
7A
Wednesday
B 7B
Thursday
6A  11B
Friday

所以我不明白什么时候上课?例如,星期三有 7A 班,但哪个时间(09:00 或 10:30 或 11:30)? 如果它写一个空格字符(&nbsp),我可以理解。

(1) (2) (3) 
09:00 10:30 11:30
12C 11B 10A
Monday
10K 10K 9A
Tuesday
&nbsp 7A &nbsp
Wednesday
B 7B &nbsp
Thursday
6A &nbsp 11B
Friday

这可以使用 iTextSharp 吗?

【问题讨论】:

标签: c# pdf itext pdf-conversion


【解决方案1】:

这在一般情况下是不可能的。

如果您的 PDF 文档没有标记,则文档本身不包含结构信息。或者简单地说,文档不知道哪些部分是表格,或者表格行,甚至是段落。

从未标记的 PDF 文档中提取结构信息很困难。如果不是在一般情况下说不可能的话。

使用 pdf2Data,您可以实现这一点。需要注意的是,您必须预先定义模板。所以你需要告诉软件它可以在哪里找到一张桌子。

您可以在iText 中查看SimpleTextExtractionStrategy。 它本质上处理所有渲染信息,并决定何时将文本连接到现有缓冲区。

在代码中的某个位置,它决定如果缓冲区已经以空格结尾,则不应再添加空格。

我建议您创建自己的 SimpleTextExtractionStrategy 实现来覆盖此行为并始终插入空格。

【讨论】:

  • “从未标记的 PDF 文档中提取结构信息很困难。如果不是说在一般情况下是不可能的。” - 是的,但是 OP 想要更简单的东西(如果我正确理解问题,即):文本提取更严格地尊重字符在行上的位置,方法是根据之前的间隙大小插入可变数量的空白字符。这毕竟不是魔法,cf。例如this answer...