0

我正在尝试从丹麦超市阅读 Offer Avis,但没有运气。这是一个类似http://www.foetex.dk/ugenstilbud/Pages/Zmags.aspx的 flash 文件。我发现您可以将 Offers Avis 下载为 PDF,之后我尝试了几天将 pdf 阅读为有用的内容,但我并没有真正得到任何东西。

这是我的代码,我的 pdf 正在阅读 https://www.dropbox.com/s/o7uhfanu459n18f/input.pdf

    public static string ReadPdfFile(string fileName)
    {
        StringBuilder text = new StringBuilder();

        if (File.Exists(fileName))
        {
            PdfReader pdfReader = new PdfReader(fileName);
            ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
            for (int page = 1; page <= pdfReader.NumberOfPages; page++)
            {

                string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

                currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
                text.Append(currentText);
            }
            pdfReader.Close();
        }
        return text.ToString();
    }

正如我所说,它并不是真的有用,因为价格并不总是与上面的产品相匹配。如果有人有任何结构化的为什么要阅读这样的pdf,请帮助我。

提前致谢。

4

1 回答 1

1

很难找到一种结构化的方式来阅读信息,因为信息并没有真正以结构化的方式呈现。

话虽如此,如果您准备好构建自己的自定义文本提取策略,内容流中有一些提示可能会有所帮助。

iText(Sharp) 带有两种默认文本提取策略,SimpleTextExtractionStrategy您使用的和LocationTextExtractionStrategy.“简单”策略不对页面布局做出任何假设,而是假设页面内容流中的文本段已经处于阅读顺序,因此, 不会尝试重新排列它们。“位置”策略假定单列多行页面布局,但不假定页面内容流中的文本段按阅读顺序排列,因此,通过与假定布局匹配的坐标重新排列它们。

您的示例 PDF实际上还需要一种不同类型的策略,这有点介于两者之间。其文本对象中的文本段(内容流中用“ BT ... ET ”括起来)属于一起并按阅读顺序排列,但彼此跟随的文本对象不一定按阅读顺序排列。

例如,“Santiago 1541 75 cl. Chile. Cabernet Sauvignon eller Chardonnay. føtex normalpris 48.95 Pr. liter 40.-”、“Frit valg”、“30.-”、“Spar 1895”是文本对象,但“Langelænder pølser” 450-500 g. Flere varianter. Pr. kg max. 40.-”、“Frit valg”、“18.-”和“Det er”是不立即相互跟随的文本对象。(此外,“Billigt”甚至不是文本,而是使用路径和填充命令绘制的。)

因此,您需要的那种文本提取策略应该以类似于方法的方式收集文本RenderText对象(分别报告给方法BeginTextBlock和)之间的开始和结束之间的文本段(报告给策略的方法),但它还应该收集坐标数据(也报告给方法)以确定包含文本对象的矩形。EndTextBlockSimpleTextExtractionStrategyRenderText

之后,它应该通过它们的包围矩形对这些文本对象内容进行排序(具有彼此靠近的矩形的文本对象最有可能属于一起)。

由于某些单词,尤其是“Billigt”事件,在 PDF 中不是以文本形式出现,而是以矢量图像形式出现,因此无法找到这些词,但很可能可以找到基本的产品和价格信息。

不过,我不确定实施该策略是否值得花时间,因为如果 fotex 更改他们的 PDF 创建软件,发现的结构可能随时更改。

PS:在收集文本对象的文本内容时,您可能还需要注意字体大小。否则解析时你只会得到“Spar 1895”

晶石 1895

PPS:有关 PDF 中文本的深入信息,请参阅 PDF 规范ISO 32000-1:2008,第 9 章文本。

于 2013-05-04T12:57:10.377 回答