2015-09-03 35 views
0

圖像的頁碼我使用的代碼從下面的鏈接來渲染圖像檢索PDF - iText的

MyImageRenderListener - IText

下面是我嘗試守則塊。我實際上在做的是找到圖像的DPI,如果圖像的dpi低於300,則將其寫入文本文件。

NOW,我也想寫這些圖片在PDF中的位置。我如何獲得該圖像的頁碼?

try { 
      String filename; 
      FileOutputStream os; 
      PdfImageObject image = renderInfo.getImage(); 
      BufferedImage img = null; 
      String txtfile = "results/results.txt"; 
      PdfDictionary imageDict = renderInfo.getImage().getDictionary(); 
      float widthPx = imageDict.getAsNumber(PdfName.WIDTH).floatValue(); 
      float heightPx = imageDict.getAsNumber(PdfName.HEIGHT).floatValue(); 
      float widthUu = renderInfo.getImageCTM().get(Matrix.I11); 
      float heigthUu = renderInfo.getImageCTM().get(Matrix.I22); 
      float widthIn = widthUu/72; 
      float heightIn = heigthUu/72; 
      float imagepdi = widthPx/widthIn; 
      filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType()); 
      System.out.println(filename+"-->"+imagepdi); 
      if(imagepdi < 300){ 
       File file = new File("C:/Users/Abhinav/workspace/itext/results/result.txt"); 



       if(filename != null){ 
        if (!file.exists()) { 
         file.createNewFile(); 
        } 

        FileWriter fw = new FileWriter(file.getAbsoluteFile(),true); 
        file.setReadable(true, false); 
        file.setExecutable(true, false); 
        file.setWritable(true, false); 
        BufferedWriter bw = new BufferedWriter(fw); 
        bw.write(filename); 
        bw.write("\r\n"); 
        bw.close(); 
       } 
      } 

回答

1

這是一個奇怪的問題,因爲它是不完整和不合邏輯的。

爲什麼你的問題不完整?

您正在使用另一個例子的情況下MyImageRenderListenerExtractImages

PdfReader reader = new PdfReader(filename); 
PdfReaderContentParser parser = new PdfReaderContentParser(reader); 
MyImageRenderListener listener = new MyImageRenderListener(RESULT); 
for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
    parser.processContent(i, listener); 
} 
reader.close(); 

在這個例子中,你遍歷每個頁面編號,驗證每一個單獨的頁面。因此,只要MyImageRenderListener返回圖像,您就知道頁碼

圖像作爲外部對象(又名XObject)存儲在PDF內部。 MyImageRenderListener返回存儲在這種流對象(包含圖像的字節)中的內容。到現在爲止還挺好。

爲什麼你的問題不合邏輯?

因爲在XObject中存儲圖像的全部目的是爲了能夠重用相同的圖像流。想象一下徽標的圖像。該圖像可以出現在文檔的每一頁上。在這種情況下,MyImageRenderListener將爲您提供與頁面相同的圖像(來自同一個流),但實際上只有一個圖像,並且它在頁面內容的外部。對於該圖像「知道」它所在的頁面沒有意義:它位於每個頁面上。即使圖像僅用於一頁,也適用相同的邏輯。這是PDF設計所固有的:圖像流不知道它屬於哪個頁面。圖像流和頁面之間的鏈接通過頁面字典的/Resources中的/XObject條目存在。

什麼將是一個優雅的方式來解決這個問題?

MyImageRenderListener從你的循環創建一個成員變量,例如:

protected int pagenumber; 

public void setPagenumber(int pagenumber) { 
    this.pagenumber = pagenumber; 
} 

使用二傳手:

PdfReader reader = new PdfReader(filename); 
PdfReaderContentParser parser = new PdfReaderContentParser(reader); 
MyImageRenderListener listener = new MyImageRenderListener(RESULT); 
for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
    listener.setPagenumber(i); 
    parser.processContent(i, listener); 
} 
reader.close(); 

現在你可以在renderImage(ImageRenderInfo renderInfo)方法使用pagenumber。這樣,當觸發此方法時,您將始終知道正在檢查哪個頁面。

+0

是的,我真的給了它一個想法,但上面的代碼是從ExtractImages。java,但我在MyImageRenderListener .java中編寫文本文件,所以如何從ExtractImages.java中獲取'i'值並將其傳遞給MyImageRenderListener .java?對不起,如果這聽起來很愚蠢我更多的PHP開發人員,所以我沒有得到一個線索如何做到這一點 – Abhinav

+0

我會更新我的答案。 –

+0

感謝一噸布魯諾,我明白了:) – Abhinav