2015-09-03 56 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