2014-06-16 66 views
1

我發現了一些examples用於如何使用iText從PDF中提取圖像。但是我正在尋找的是通過座標獲取來自PDF的圖像。使用iText從PDF座標中提取圖像

可能嗎?如果是,那麼它是如何完成的。

+1

您引用的示例將提取PDF中存在的圖像資源。這些圖像並不是完全需要顯示的圖像,因爲a)可能會有比實際使用的資源更多的資源,b)這種方法會忽略內嵌圖像。因此,你應該使用iText'parser'包中的類。查看iText示例[ExtractImages](http://itextpdf.com/examples/iia.php?id=284)。 ImageRenderInfo對象包含座標信息。 – mkl

+0

謝謝@mkl指出我正確的例子。你能告訴我們如何使用座標來從這個例子中獲取圖像。 – rizzz86

回答

1

沿着iText的示例的線ExtractImages可以這樣提取的代碼:

PdfReader reader = new PdfReader(resourceStream); 
PdfReaderContentParser parser = new PdfReaderContentParser(reader); 
ImageRenderListener listener = new ImageRenderListener("testpdf"); 

for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
    parser.processContent(i, listener); 
} 

ImageRenderListener的定義如下:

class ImageRenderListener implements RenderListener 
{ 
    final String name; 
    int counter = 100000; 

    public ImageRenderListener(String name) 
    { 
     this.name = name; 
    } 

    public void beginTextBlock() { } 
    public void renderText(TextRenderInfo renderInfo) { } 
    public void endTextBlock() { } 

    public void renderImage(ImageRenderInfo renderInfo) 
    { 
     try 
     { 
      PdfImageObject image = renderInfo.getImage(); 
      if (image == null) return; 
      int number = renderInfo.getRef() != null ? renderInfo.getRef().getNumber() : counter++; 
      String filename = String.format("%s-%s.%s", name, number, image.getFileType()); 
      FileOutputStream os = new FileOutputStream(filename); 
      os.write(image.getImageAsBytes()); 
      os.flush(); 
      os.close(); 

      PdfDictionary imageDictionary = image.getDictionary(); 
      PRStream maskStream = (PRStream) imageDictionary.getAsStream(PdfName.SMASK); 
      if (maskStream != null) 
      { 
       PdfImageObject maskImage = new PdfImageObject(maskStream); 
       filename = String.format("%s-%s-mask.%s", name, number, maskImage.getFileType()); 
       os = new FileOutputStream(filename); 
       os.write(maskImage.getImageAsBytes()); 
       os.flush(); 
       os.close(); 
      } 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

正如所看到的ImageRenderListener方法renderImage檢索的參數ImageRenderInfo。這個論點有方法

  • getStartPoint給你在用戶空間代表了X對象
  • getImageCTM的起點給你向量的座標變換矩陣活躍時,這個圖像呈現。座標位於用戶空間中。

後者爲您提供了1x1用戶空間單位正方形的確切操作用於實際繪製圖像的信息。如您所知,圖像可能會旋轉,拉伸,偏斜和移動(前一種方法實際上是從「移動」信息中的矩陣中提取其結果)。