2013-05-03 131 views
0

我正试图从丹麦超市购买优惠Avis,但没有运气。这是一个像这样的闪存文件http://www.foetex.dk/ugenstilbud/Pages/Zmags.aspx。 我发现你可以下载PDF格式的优惠Avis,之后我已经尝试了几天来阅读pdf,以获得一些有用的信息,但我并没有真正得到任何东西。阅读优惠Avis

这里是我的代码,并且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请帮助我。

在此先感谢。

回答

1

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

这就是说,如果您准备构建自己的自定义文本提取策略,那么内容流中可能会提供一些提示。 (Sharp)带有两种默认的文本提取策略,您使用的SimpleTextExtractionStrategyLocationTextExtractionStrategy.“简单”策略不会对页面布局做出任何假设,但会假定页面内容流中的文本段处于已经阅读订单,因此不会尝试重新安排。 “位置”策略假定单列多行页面布局,但不假定页面内容流中的文本段处于阅读顺序,因此,通过与假定布局匹配的坐标重新排列它们。

你的sample PDF实际上需要一种不同类型的策略,这种策略在某种程度上是有意义的。其文本对象中的文本片段(在内容流中括起来为“BT ... ET”)属于阅读顺序,但相互之后的文本对象不一定按阅读顺序排列。

E.g. “Santiago 1541 75 cl。Chile。Cabernet Sauvignon eller Chardonnay。føtexnormalpris 48.95 Pr. liter 40.-”,“Frit valg”,“30.-”,“Spar 1895”are text object each other but“Langelænderpøser450 -500克Flere varianter.Pr.kg.最大40.-“,”熔块阀值“,”18.-“和”Deter“是不直接相互跟随的文本对象。 (此外,“Billigt”甚至不是文本,而是使用路径和填充命令来绘制。)

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

然后,它应该通过它们的包围矩形(具有彼此最接近的矩形的文本对象最可能属于一起)对这些文本对象内容进行排序。由于有些单词,特别是“Billigt”的出现,并非作为PDF中的文本出现,而是作为矢量图像存在,所以不会找到这些单词,但最有可能的是找到基本的产品和价格信息。

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

PS:在收集文本对象的文本内容时,您可能还需要留意字体大小。在PDF中对于深入的信息文本参考PDF规范ISO 32000-1:2008,第9章文字:否则在解析时

Spar 1895

PPS你只是得到“晶石1895年”。