2014-11-04 169 views
1

我需要做的是提取二维DataMatrix(位图)条形码并读取它。然而,我可以使这项工作,我必须遍历每个页面上的所有图像。当我有1000页的页面时,这需要很长时间,所以我想知道是否可以定义图像(条形码)的位置(矩形)并提取该图像?ITextSharp - 在特定位置获取图像

条形码总是我在同一个位置。 注意:我使用的是来自e-IceBlue的Spire.Barcode

谢谢你的帮助。

CODE RenderFilter片段:

public class MyRegionTextRenderFilter : RenderFilter { 

      /** the region to allow text from */ 
      private RectangleJ filterRect; 
      public PdfImageObject image; 
      /** 
      * Constructs a filter 
      * @param filterRect the rectangle to filter text against. Note that this is a java.awt.Rectangle ! 
      */ 
      public MyRegionTextRenderFilter(RectangleJ filterRect) { 
       this.filterRect = filterRect; 
      } 

      /** 
      * Constructs a filter 
      * @param filterRect the rectangle to filter text against. 
      */ 
      public MyRegionTextRenderFilter(iTextSharp.text.Rectangle filterRect) 
      { 
       this.filterRect = new RectangleJ(filterRect); 
      } 


      /** 
      * @see com.itextpdf.text.pdf.parser.RenderFilter#allowText(com.itextpdf.text.pdf.parser.TextRenderInfo) 
      */ 
      public override bool AllowImage(ImageRenderInfo renderInfo) 
      { 
       var matrix = renderInfo.GetImageCTM(); 
       float left = matrix[6]; 
       float top = matrix[7]; 
       float width = matrix[0]; 
       float height = matrix[4]; 

       return filterRect.IntersectsLine(left, top, width, height); 
      } 
     } 

编码呼叫:

RectangleJ rect = new RectangleJ(518.0f, 18.0f, 23.0f, 23.0f); 
      PdfReaderContentParser parser2 = new PdfReaderContentParser(pdfReader); 
      RenderFilter[] renderFilter = new RenderFilter[1]; 
      renderFilter[0] = new MyRegionTextRenderFilter(rect); 
      FilteredTextRenderListener listener2 = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), renderFilter); 
      parser2.ProcessContent(3, listener2); 
+0

您可能想要使用'RegionTextRenderFilter'。 – mkl 2014-11-04 17:00:29

+0

好吧我知道如何使用RegionTextRenderFilter获取文本,我知道如何获取图像信息,但是如何从RegionTextRenderFilter获取图像? – Mike 2014-11-04 18:25:53

+1

好的,不是'RegionTextRenderFilter',而是图像的等价物。只需复制[RegionTextRenderFilter](https://svn.code.sf.net/p/itextsharp/code/trunk/src/core/iTextSharp/text/pdf/parser/RegionTextRenderFilter.cs)并添加一个'AllowImage(ImageRenderInfo renderInfo)类似于现有的'AllowText(TextRenderInfo renderInfo)'方法的实现。 – mkl 2014-11-05 08:29:03

回答

1

iText的(夏普)的解析器命名空间允许的通过使用RenderFilterIRenderListener实施消化信息过滤:

public abstract class RenderFilter { 

    /** 
    * @param renderInfo 
    * @return true if the text render operation should be performed 
    */ 
    public virtual bool AllowText(TextRenderInfo renderInfo){ 
     return true; 
    } 

    /** 
    * 
    * @param renderInfo 
    * @return true is the image render operation should be performed 
    */ 
    public virtual bool AllowImage(ImageRenderInfo renderInfo){ 
     return true; 
    } 
} 

按区域过滤已经是一个文本渲染过滤器,RegionTextRenderFilter

对于您的任务,只需将其复制并添加一个类似于现有AllowText(TextRenderInfo renderInfo)方法的AllowImage(ImageRenderInfo renderInfo)实现。

+0

嗨MKL,我得到了很远,但我有一点损失,想知道如果你可以看看代码(上面)我可以找到矩形的图像基础,但我不知道如何获得图像?任何帮助都会很棒。再次感谢 – Mike 2014-11-05 20:30:39

+0

你原来的代码控制了一个'MyImageRenderListener' - 为什么你不继续使用它或至少是一个可比的图像监听器? – mkl 2014-11-06 09:06:59

+0

是的,我昨天晚上做的很好,谢谢! – Mike 2014-11-06 14:02:03